BASH: Přesměrování: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Doplnění)
(Standardní proudy: doplnění)
 
Řádka 21: Řádka 21:
 
V unixových systémech je zavedena dohoda, podle které je nově spuštěný program standardně (implicitně) vybaven třemi otevřenými datovými proudy (deskriptory). Jedná se o standardní vstup (''stdin''), standardní výstup (''stdout'') a standardní chybový výstup (''stderr'') – viz tabulka vpravo. Standardní vstup je napojen na klávesnici a standardní výstup a standardní chybový výstup je připojen na monitor (viz diagram níže).
 
V unixových systémech je zavedena dohoda, podle které je nově spuštěný program standardně (implicitně) vybaven třemi otevřenými datovými proudy (deskriptory). Jedná se o standardní vstup (''stdin''), standardní výstup (''stdout'') a standardní chybový výstup (''stderr'') – viz tabulka vpravo. Standardní vstup je napojen na klávesnici a standardní výstup a standardní chybový výstup je připojen na monitor (viz diagram níže).
  
Pokud program potřebuje získat data, čte je z proudu 0 (nula). Potřebuje-li něco vypsat, použije proud 1, avšak pro výpis chybových hlášení se používá proud 2. Pomocí jejich oddělení je možné v případě potřeby odlišit výstup výsledků programu a chybových hlášení. Pokud program otevírá soubory, jsou jim přidělovány další volná čísla proudů. Naopak démoni<ref>http://cs.wikipedia.org/wiki/D%C3%A9mon_%28software%29</ref> po svém spuštění všechny tři proudy zavírají, aby se odpojili od terminálu i uživatele (nepotřebují interakci s uživatelem a svá hlášení zapisují do systémového logu).
+
Pokud program potřebuje získat data, čte je z proudu 0 (nula). Potřebuje-li něco vypsat, použije proud 1, avšak pro výpis chybových hlášení se používá proud 2. Pomocí jejich oddělení je možné v případě potřeby odlišit výstup výsledků programu a chybových hlášení. Díky tomuto principu lze snadno příkazy sdružovat do kolon (viz [[BASH: Kolony]]) a používat programy jako filtry.
  
                                                                    +----------+
+
Pokud program otevírá soubory, jsou jim přidělovány další volná čísla proudů. Naopak démoni<ref>http://cs.wikipedia.org/wiki/D%C3%A9mon_%28software%29</ref> po svém spuštění všechny tři proudy zavírají, aby se odpojili od terminálu i uživatele (nepotřebují interakci s uživatelem a svá hlášení zapisují do systémového logu).
                stdin      0 +---------+ 1    stdout              |          |
+
 
 +
 
 +
                              +---------+                         +----------+
 +
                stdin      0 |        | 1    stdout              |          |
 
  klávesnice ------------------>+ program +------------------------->|          |
 
  klávesnice ------------------>+ program +------------------------->|          |
             standardní vstup  +----+----+   standardní výstup      | terminál |
+
             standardní vstup  |        |  standardní výstup      | terminál |
                                     |                               |          |
+
                              +----+----+                         |         |
 +
                                     | 2                            |          |
 
                                     +------------------------------>|          |
 
                                     +------------------------------>|          |
 
                                       standardní chybový výstup    +----------+
 
                                       standardní chybový výstup    +----------+

Aktuální verze z 25. 11. 2009, 17:22

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

Standardní proudy

Číslo Zkratka Název
0 stdin Standardní vstup
1 stdout Standardní výstup
2 stdin Standardní chybový výstup

V unixových systémech je zavedena dohoda, podle které je nově spuštěný program standardně (implicitně) vybaven třemi otevřenými datovými proudy (deskriptory). Jedná se o standardní vstup (stdin), standardní výstup (stdout) a standardní chybový výstup (stderr) – viz tabulka vpravo. Standardní vstup je napojen na klávesnici a standardní výstup a standardní chybový výstup je připojen na monitor (viz diagram níže).

Pokud program potřebuje získat data, čte je z proudu 0 (nula). Potřebuje-li něco vypsat, použije proud 1, avšak pro výpis chybových hlášení se používá proud 2. Pomocí jejich oddělení je možné v případě potřeby odlišit výstup výsledků programu a chybových hlášení. Díky tomuto principu lze snadno příkazy sdružovat do kolon (viz BASH: Kolony) a používat programy jako filtry.

Pokud program otevírá soubory, jsou jim přidělovány další volná čísla proudů. Naopak démoni[1] po svém spuštění všechny tři proudy zavírají, aby se odpojili od terminálu i uživatele (nepotřebují interakci s uživatelem a svá hlášení zapisují do systémového logu).


                              +---------+                          +----------+
                stdin       0 |         | 1    stdout              |          |
klávesnice ------------------>+ program +------------------------->|          |
            standardní vstup  |         |  standardní výstup       | terminál |
                              +----+----+                          |          |
                                   | 2                             |          |
                                   +------------------------------>|          |
                                      standardní chybový výstup    +----------+

Přehled symbolů pro přesměrování

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

Poznámka: přepsání existujícího souboru je možné jen když není nastavena volba noclobber.

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           # výstup programu je přesměrován do souboru text.txt
echo kuk > text.txt          # obsah souboru text.txt je přepsán (jeden řádek se slovem kuk)
echo na strejdu >> text.txt  # k obsahu souboru je přidán další řádek

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

Analýza vnitřku souboru

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řesměrování chybového výstupu

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

Sloučení chybového výstupu se standardním výstupem

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, aby zobrazovaný text procházel standardním chybovým výstupem:

echo POZOR: nemohu přečíst soubor XY 1>&2

Volba noclobber

Volba noclobber umožňuje zabránit nechtěnému přepsání existujícího souboru (při přesměrováním pomocí znaku >).

set -o              # výpis aktuálních nastavení voleb shellu
set -o noclobber    # zapnutí volby noclobber
set +o noclobber    # vypnutí volby noclobber

Externí odkazy

  • http://cs.wikipedia.org/wiki/D%C3%A9mon_%28software%29