BASH: Přesměrování
Přesměrování v shellu BASH umožňuje využít manipulaci se standardním vstupem a standardními výstupy ke změně komunikace spouštěného programu s okolím. Přesměrování provádí vždy shell, takže je vždy funkční a jednotné (na rozdíl od DOSu, kde se o přesměrování starají jednotlivé programy samostatně, používá se různě nebo vůbec nefunguje).
Konstrukce Funkce >
Přesměrování standardního výstupu (vytvoří nebo přemaže existující soubor) >>
Přesměrování standardního výstupu (vytvoří nebo přidá za konec existujícího souboru) <
Přesměrování standardního vstupu 2>
Přesměrování do standardního chybového výstupu 2>&1
Spojení standardního chybového výstupu se standardním výstupem 1>&2
Spojení standardního výstupu se standardním chybovým výstupem (používá se při programování skriptů) <<MARK
Here document (používá se při programování skriptů)
Příklady
Při přesměrování standardního výstupu pomocí znaku >
je existující soubor přepsán. Přesměrování pomocí >>
přidává za konec existujícího souboru. V obou případech platí, že pokud soubor neexistuje, je vytvořen.
ls /bin > text.txt echo kuk > text.txt echo na strejdu >> text.txt
Většina programů považuje za svůj standardní vstup soubory, které jsou předány na příkazovém řádku jako parametry. Některé programy však toto vylepšení nemají implementováno a vždy předpokládají vstup na standardním vstupu. V následujícím příkladu je nejprve vytvořen soubor text.txt
se dvěma řádky tak, že u příkazu echo
je použit přepínač -e
, který způsobí v tištěném řetězci interpretaci sekvence \n
jako přechod na nový řádek. Následně je soubor text.txt
převeden do formátu DOS/WINDOWS příkazem unix2dos
a zaznamenán do souboru dos.txt
.
/bin/echo -e "prvni\ndruhy" > text.txt unix2dos < text.txt > dos.txt
Poznámka: Pomocí příkazu hexdump
je možné provést inspekci obou souborů a zjistit, že v unixovém souboru text.txt
je zaznamenán řídící znak LF (hexadecimálně 0x0A
) a v převedeném souboru dos.txt
je ve formátu DOS/WINDOWS používána sekvence CR/LF (0x0D
, 0x0A
). V příkladu je tučně zvýrazněn vstup od uživatele a znak $ (dolar) reprezentuje výzvu shellu (prompt):
$ hexdump -C text.txt 00000000 70 72 76 6e 69 0a 64 72 75 68 79 0a |prvni.druhy.| 0000000c $ hexdump -C dos.txt 00000000 70 72 76 6e 69 0d 0a 64 72 75 68 79 0d 0a |prvni..druhy..| 0000000e
Při dávkovém použití mohou rušit chybová hlášení, které programy produkují. Proto se často chybový výstup přesměrovává do speciálního souboru /dev/null
, který funguje zhruba jako bezedný odpadkový koš (vše, co se do něj zapíše, se ihned zahodí):
find /proc -name fd 2> /dev/null grep root: /etc/* 2> /dev/null
Někdy je naopak potřeba uchovat výstup příkazu včetně chybových hlášení. Všimněte si, že při přesměrování do souboru je spojení standardního výstupu se standardním chybovým výstupem umístěno až za přesměrováním. Pokud by byl zápis proveden obráceně, nebude fungovat.
grep root: /etc/* > text.txt 2>&1
Při programování skriptů je někdy vhodné jednoduše přesměrovat standardní výstup příkazu na standardní chybový výstup:
echo POZOR: nemohu přečíst soubor XY 1>&2