Portál AbcLinuxu, 6. května 2025 18:01
echo "This script" 1>&2
Řešení dotazu:
Spojení standardního výstupu se standardním chybovým výstupemale nedává mi to smysl, chyba se vypíše na screen ale taky do chybového výstupu? A co s tím? K čemu je to jako dobré? Pochopil bych, kdyby tam bylo:
echo "This script" 1>&2 /tmp/error.logMůžeš mi to prosím objasnit, když tam není soubor, kde to získam tu chybu? Díky
stdout
(standardní výstup - standard output), kam se vypisuje veškerý běžný text, který má program potřebu vypsat. Deskriptor (identifikační číslo souboru přidělené systémem) tohoto výstupu je pro každý program 1.
stderr
, kam může program vypisovat chyby. Deskriptor přidělený systémem je 2.
Terminál ti umožňuje výstupy z programů přesměrovávat. 1>&2
znamená, že chceš přesměrovat stdout
do stderr
.
$ echo "xe" xeV tomhle případě šel výstup z echa, které běžně vypisuje na
stdout
do terminálu.
$ echo "xe" 1>&2 xeTohle vypadá na první pohled stejně - výstup šel do terminálu. Děje se zde ovšem cosi víc - výstup sice šel do terminálu, ale nikoliv na výstup (
stdout
), ale na chybový výstup (stderr
)! Přesměrovali jsme tedy stdout
(deskriptor 1) na stderr
(desktiptor 2).
$ echo "xe" 2>/dev/null 1>&2Nyní jsem přesměroval chybový výstup do souboru
/dev/null
a standardní výstup do chybového výstupu. Jak je možné vidět, nic se nevypsalo, protože oboje jde do souboru /dev/null
, který slouží jako forma odpadkového koše.
find
a wc
, který počítá řádky (a další věci), které mu napíšeš na vstup. find
má však tu ošklivou vlastnost, že vždy vypíše, když k nějakému souboru nemůže získat přístup. Pokud použiji naivní implementaci:
$ find / -name "xaxex*" | wc -l find: `/tmp/pulse-PKdhtXMmr18n': Permission denied find: `/tmp/atop.d': Permission denied find: `/run/udisks': Permission denied find: `/run/lighttpd': Permission denied find: `/run/cups/certs': Permission denied find: `/run/samba/winbindd_privileged': Permission denied find: `/run/watershed': Permission denied find: `/run/lock/lvm': Permission denied find: `/proc/tty/driver': Permission denied .... pár tisíc řádekTak sice funguje, ale jsem zaplaven tisícema řádek hlášek o tom, že
find
nemohl k něčemu získat přístup. Řešení je přesměrovat chybový výstup do pryč:
$ find / -name "xaxex*" 2>/dev/null | wc -l 0V upravené verzi vidím jen to co jsem chtěl - že na disku mám 0 souborů začínajících názvem "xaxex".
2>&1
je trochu zvláštní zápis, běžně se používá spíš opak: stderr
do stdout
, protože s tím se pak dá lépe pracovat (|
i >
běžně přesměrovává stdout
, ne stderr
).
1>&2
používá, aby bylo jasné, že nechceš přesměrovávat do souboru s názvem 2, ale do deskriptoru číslo 2. Kdybys tam & nenapsal, vytvořil by se ti ve složce soubor 2, ve kterém by byl výpis, který šel na stdout
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.