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/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ěď
-
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/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.
-
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 ".