Pro příkaz, pokud používáte -
jako argument namísto názvu souboru bude znamenat STDIN nebo STDOUT.
V tomto příkladu však vytvoří soubor se jménem -
:
echo hello > -
Jak mohu udělat -
v tomto příkladu znamená STDOUT?
Naopak, jak mohu udělat -
znamená soubor s názvem -
v příkladech jako:
cat -
Použitím -
jako název souboru znamená stdin/stdout je konvence, kterou používá mnoho programů. Nejedná se o zvláštní 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žije -
doslova jako název souboru.
S přesměrováním bash, -
není rozpoznáno jako zvláštní název souboru, takže bash použije toto jako doslovný název souboru.
Když cat
uvidí řetězec -
jako název souboru, považuje se za synonymum pro stdin. Chcete-li to obejít, musíte změnit řetězec, který cat
vidí takovým způsobem, aby stále odkazoval na soubor s názvem -
. Obvyklým způsobem je předpona názvu souboru před cestou - ./-
nebo /home/Tim/-
. Tato technika se také používá k obcházení podobných problémů, kdy se možnosti příkazového řádku střetávají s názvy souborů, takže soubor označovaný jako ./-e
se neobjeví jako -e
například možnost příkazového řádku k programu.
Namísto echo hello > -
, Můžeš 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), nezávislé na aplikaci a poté budou fungovat tak, jak chcete.
Jak zmínil se camh , -
je pouze pojmenovací konvence používaná některými programy. Pokud se chcete na tyto proudy odkazovat pomocí deskriptoru souboru, Shell rozpozná, jiliagre byla správná tím, že jste použili jméno /dev/stdin
nebo /dev/stdout
namísto. Tyto názvy souborů by měly fungovat kdekoli, kde by fungoval normální název souboru.
Jak již bylo řečeno, váš první příklad je hloupý. Jakýkoli výstup, který by zachytil operátor přesměrování pro zápis do souboru, je již zapnutý standardní výstup, takže přesměrování a zápis zpět tam, odkud přišel, je zbytečný. Chování, které zde používáte, je potrubí, nikoli přesměrování:
echo hello |
Ve druhém příkladu stačí uvést, že chcete nějaký litterální soubor tohoto jména, nikoli vnitřní alias, který má. To lze provést nejjednodušší zadáním cesty k souboru, jako je tento:
cat ./-
Pokud jde o 1, program jej musí podporovat. Nemůžete jej použít libovolně. Pokud jde o 2, přesměrujte vstup z (např. cat < -
).
Přístup „-“ má mnoho problémů. Nejprve vyžaduje interpretaci charakteru „-“ a mnoho programů tuto interpretaci neprovádí. A navíc existují některé programy, které interpretují spojovník jako oddělovač označující konec možností příkazového řádku. Programy jsou psány pro práci s argumenty pro název souboru, přístup „-“ je hack, Nice, ale slabý.
Nejlepší způsob je:
$ echo hello > /dev/fd/1
/dev/stdout
je symbolický odkaz uživatele /dev/fd/1
Speciální znaky mají většinou dva významy:
ASCII numerická tabulka.
Skriptování nebo symbolické.
Je možné, že jeden znak představuje řetězec nebo funguje jako řetězec. jako moje chápání.
v jazyce C funkce fopen()
vezme 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.
kočka> "-" funguje.