Přesměrování
Přesměrování je v informatice funkce společná většině interpretů pro příkazový řádek. Využívá se zejména v unixových shellech, kde je přesměrování standardních proudů běžně využíváno. Přesměrování je možné použít též v interpretu příkazového řádku pro DOS (COMMAND.COM) a Windows NT (cmd.exe), i když v nich přesměrování nefunguje univerzálně a ve všech případech.
V unixových systémech provádí programátor přesměrování pomocí systémové volání dup2()
nebo vyšších funkcí ze standardní knihovny jazyka C (funkce popen(3)
a freopen(3)
pro práci se standardními proudy).
Přesměrovávání standardního vstupu a standardního výstupu
Přesměrování je obvykle realizováno umístěním určitého znaku před příkazy. Typická syntaxe těchto znaků je:
$ příkaz1 > soubor1
provede příkaz1 a umístí výstup do soubor1. Výstupní data nahradí existující data v soubor1.
Pro přidání výstupu na konec souboru použijte >> operátor:
$ příkaz1 >> soubor1
$ příkaz1 < soubor1
provede příkaz1, standardní vstup je čten z existujícího souboru.
$ příkaz1 < vstupní soubor > vystupní soubor
kombinace dvou možností: příkaz1 čte ze vstupního souboru a ukládá do výstupního souboru.
Přesměrování z a do standardního souboru pomocí deskriptorů
V Unixových shellech (většinou v Bourne shellech), mohou být první dvě akce také modifikovány umístěním čísla (file descriptor) přímo před znak. To určí, který proud je použitý pro přesměrování. Unixové standardní I/O proudy jsou:
Deskriptor | Název | Popis |
---|---|---|
0 | stdin | Standardní vstup |
1 | stdout | Standardní výstup |
2 | stderr | Standardní chyba |
Například:
$ příkaz1 2> soubor1
provede příkaz1 a přesměruje stderr proud do souboru1.
V shellech odvozených od csh (the C shell) lze použít & znak místo přesměrovacích znaků s podobným výsledkem.
Další možnost aplikace je přesměrování jednoho standardního souboru do druhého. Nejznámější varianta je vložení stderr do stdout. Chybové zprávy tak mohou být zpracovány společně se standardním výstupem (nebo namísto výstupu). Například:
$ find / -name .profile > výsledek 2>&1
se pokusí najít všechny soubory nazvané .profile. Toto se provede bez přesměrování a uloží výstup do stdout a chybu do stderr. Jestliže je stdout nasměrován do souboru “výsledek”, objeví se chybová zpráva na konzoli. Jestliže chceme mít výstup i chybovou zprávu v souboru “výsledek”, sloučíme stderr (deskriptor 2) s stdout (deskriptor 1) použitím 2>&1.
Jestliže je vložený výstup připojen (rourován) do jiného programu, musí sekvenci 2>&1 předcházet symbol roury. Takto:
$ find / -name .profile 2>&1 | less
Zjednodušená forma příkazu:
$ příkaz > soubor 2>&1
je (není k dispozici v Bourne Shell před verzí 4):
$ příkaz &>soubor
nebo:
$ příkaz >&soubor
Externí odkazy
- Redirection Definition by The Linux Information Project (LINFO)
- I/O Redirection in The Linux Documentation Project
- Redirection in Windows
- Creating a Child Process with Redirected Input and Output in Windows