Použití pomlčky (-) namísto názvu souboru

U příkazu, pokud jako argument použijete - místo názvu souboru bude znamenat STDIN nebo STDOUT.

  1. Ale v tomto příkladu vytvoří soubor s názvem -:

    echo hello > - 

    Jak mohu v tomto příkladu označit - jako STDOUT?

  2. Naopak, jak mohu v příkladech - označit soubor s názvem -:

    cat - 

Komentáře

  • Protože k přímému komentování musím mít zjevně 50 pověstí. V komentáři / dev / stdin / dev / stdout AIX, který je legitimním derivátem systému UNIX, tyto pseudozařízení nemá. A jako další komentář, LINUX není v žádném případě derivátem UNIX. Jedná se o dílo kompatibilní s POSIX a v tomto okamžiku nejoblíbenější OS UNIX-ish OS ' s, ale nedělejte si chybu, toto není UNIX. Podstata zde uvedených odpovědí je však správná. Notace " – " není shellem interpretována jako speciální, a je tedy předána přímo každé jednotlivé aplikaci jako ARG. Pokud aplikace nerozpozná
  • Existují také 2>&- konstrukce, což znamená " zavřít deskriptor 2 ".
  • @ user95873, předpokládám, že jste chtěl říct: zatímco Linux je podobný Unixu, ne každý Unixový (nebo pravý UNIX) je Linux . To, zda Linux je nebo není ' t skutečný UNIX (tj. Vyhovuje specifikaci Single UNIX), nemá ' vztah k / dev / std {in, out, err} problém. As / dev / std {in, out, err} je přidaná funkce, nikoli chybí .

Odpověď

Použití - jako názvu souboru znamená stdin / stdout je konvence, kterou používá mnoho programů. Není to speciální vlastnost názvu souboru. Jádro nerozpozná - jako speciální, takže všechna systémová volání odkazující na - jako název souboru použijí - doslovně jako název souboru.

Při přesměrování bash není - rozpoznán jako speciální název souboru, takže bash jej použije jako doslovný název souboru.

Když cat vidí řetězec - jako název souboru, považuje jej za synonymum pro stdin. Chcete-li to obejít, musíte změnit řetězec, který cat vidí tak, že stále odkazuje na soubor s názvem -. Obvyklým způsobem je předpona názvu souboru s cestou – ./- nebo /home/Tim/-. Tato technika se také používá k řešení podobných problémů, kdy možnosti příkazového řádku kolidují s názvy souborů, takže soubor označovaný jako ./-e se nezobrazí jako -e například možnost příkazového řádku k programu.

Komentáře

  • Je to ' s stojí za to dodat, že /dev/stdin a /dev/stdout jsou všeobecně dostupné a lze je použít místo - convention.
  • @jmtd: / dev / std {in, out} nejsou univerzálně dostupné. Ne všechny unixy to mají.
  • Zajímavé, předpokládal jsem, že jsou součástí POSIXu (ale ' t to potvrdit). Prezentují se ' alespoň na Linuxu, BSD a Solaris. Můžete uvést příklad moderního systému UNIX, který jim chybí?
  • @camh Nejste si jisti, zda jste dostali oznámení, a toto je velmi, velmi staré téma; Nejsem si jistý, jestli můžete, ale ' jsem velmi zvědavý, jestli znáte odpověď na jmtd ' s otázkou? 🙂
  • @jmtd Zdá se, že jsem našel předběžnou odpověď na otázku: unix.stackexchange.com/a/278368/31669

Odpověď

  1. Místo echo hello > -, můžete použít echo hello > /dev/stdout.

    Zatímco „-“ je konvence, kterou musí implementovat každý program, který ji chce podporovat, /dev/stdin, /dev/stdout a /dev/stderr jsou, pokud jsou podporovány operačním systémem (alespoň systémy Solaris, Linux a BSD ano) , nezávisle na aplikaci a poté bude fungovat podle vašich představ.

Odpovědět

Jako zmíněný camh , - je pouze konvence pojmenování používaná některými programy.Pokud chcete na tyto streamy odkazovat pomocí deskriptoru souborů, který shell rozpozná, jiliagre byla správná , když jste použili název /dev/stdin nebo /dev/stdout. Tyto názvy souborů by měly fungovat kdekoli, kde by fungoval normální název souboru.

  1. To znamená, že váš první příklad je trochu hloupý. Jakýkoli výstup, který by operátor přesměrování zachytil při zápisu do souboru, je již ON standardní výstup, takže jeho přesměrování a zápis zpět na místo, odkud pochází, je k ničemu. Chování, které tam používáte, je roura, nikoli přesměrování:

    echo hello | 
  2. Ve druhém příkladu jednoduše musíte dát can some označení, že chcete soubor s tímto jménem, nikoli interní alias, který má. Nejjednodušší způsob je zadat cestu k souboru takto:

    cat ./- 

Odpovědět

Pokud jde o 1, program jej musí podporovat. Nelze jej libovolně použít. Pokud jde o 2, přesměrujte vstup z (např. cat < -).

Odpovědět

Přístup „-“ má spoustu problémů. Nejprve vyžaduje interpretaci znaku „-“ a mnoho programů takovou interpretaci neprovádí. A navíc existují některé programy, které interpretují pomlčku jako oddělovač označující konec možností příkazového řádku. Programy jsou psány pro práci s argumenty názvu souboru, přístup „-“ je hack, pěkný, ale slabý.

Nejlepší způsob je:

$ echo hello > /dev/fd/1 

/dev/stdout je symbolický odkaz na /dev/fd/1

komentáře

  • Přesměrování je interpretováno shellem, nikoli vyvolávaným programem.

Odpověď

Speciální znaky mají většinou dva významy:

Číselný graf ASCII.

Skriptování nebo symbolika.

Je možné, že jeden znak představuje řetězec nebo funguje jako řetězec. Podle mého chápání.

v jazyce C fopen() Funkce přebírá dva argumenty, první proud souboru a druhý režim, ve kterém bude soubor otevřen. Režim je řetězec. I když je to jediný znak.

cat > " – " funguje.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *