U příkazu, pokud jako argument použijete - místo názvu souboru bude znamenat STDIN nebo STDOUT.
-
Ale v tomto příkladu vytvoří soubor s názvem
-:echo hello > -Jak mohu v tomto příkladu označit
-jako STDOUT? -
Naopak, jak mohu v příkladech
-označit soubor s názvem-:cat -
Komentáře
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/stdina/dev/stdoutjsou 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ěď
-
Místo
echo hello > -, můžete použítecho hello > /dev/stdout.Zatímco „-“ je konvence, kterou musí implementovat každý program, který ji chce podporovat,
/dev/stdin,/dev/stdouta/dev/stderrjsou, 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.
-
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 | -
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.
2>&-konstrukce, což znamená " zavřít deskriptor 2 ".