Intro
Někdy v shellu vidíme příkazy jako tento:
- $ ls foo > /dev/null 2>&1
Poprvé může být obtížné pochopit, co to dělá, proto to v této poznámce stručně vysvětlíme.
Přesměrování I/O
Předpokládejme, že nyní máte jednoduchý textový soubor:
Při procesu přesměrování došlo k chybě, protože v níže uvedeném adresáři není žádný soubor s názvem no_such_file.txt. V tomto případě, přestože je použit příkaz >, není možné zapsat obsah do souboru output.txt, protože není k dispozici obsah stdout, ale chybové hlášení stderror.
Deskriptor souboru
Deskriptor souboru si lze představit jako kladné celé číslo otevřeného souboru. Pokud máte 100 otevřených souborů, máte v podstatě 100 odpovídajících deskriptorů souborů.
V systémech typu Unix/Unix existují také deskriptory souborů určené pro stdout a stderr, které, aby bylo jasno, mají vyhrazená místa určení pro výstup těchto souborů.pro tyto výstupní cíle:
- 1: pro stdout
- 2: pro stderr
Složení všeho dohromady
Podle výše uvedeného konceptu, pokud chcete zapsat obsah známého souboru do jiného souboru, můžete tak učinit.
Jednička na této straně představuje stdout, jehož syntaxe je reprezentována jako:
- >
Takže když vidíte, že někdo píše from.foo > to.bar, je to prostě vynechání.
Podobně můžete přesměrovat stderr takto:
Pokud chcete přesměrovat jak stdout, tak stderr na stejné místo určení, můžete to udělat takto.
- &1 se používá jako odkaz na deskriptor souboru s id 1, tj. odkaz na stdout.
- 2>&1 znamená přesměrování obsahu stderr na stdout.
Souhrn
- Obvykle existují dvě místa určení výstupu: stdout a stderr.
- Výstup můžeme nasměrovat na různá místa, ale obvykle do souboru.
- Deskriptor souboru lze použít k rozlišení mezi stdout (1) a stderr (2).
- příkaz > output_location je ve skutečnosti zkratkou příkazu 1> output_location.
- Pro odkazování na jiné deskriptory souborů můžeme použít &
.