it-swarm-eu.dev

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

Pro příkaz, pokud používáte - jako argument namísto názvu souboru bude znamenat STDIN nebo STDOUT.

  1. V tomto příkladu však vytvoří soubor se jménem -:

    echo hello > -
    

    Jak mohu udělat - v tomto příkladu znamená STDOUT?

  2. Naopak, jak mohu udělat - znamená soubor s názvem - v příkladech jako:

    cat -
    
121
Tim

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.

169
camh
  1. 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.

18
jlliagre

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.

  1. 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 |
    
  2. 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 ./-
    
10
Caleb

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 < -).

6
bahamat

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

1
b3h3m0th

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.

0
Owais Qureshi