Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#3111: Umíte používat rouru/pipe (|)? Jaké další podobné operátory můžete využívat? 

Rouru (|) znáte? A co < a >? Víte jak tyhle věcí fungují a k čemu je můžete použít? Liší se to nějak mezi operačními systémy?

Každý program má standardní vstup (stdin), standardní výstup (stdout) a často taky standardní chybový výstup (stderr). V rámci toho jsou pak |, < a > operátory přesměrování – rourou se propojí výstup z jednoho programu jako vstup do jiného. A menšítko a většítko umožní propojit soubor místo klávesnice/obrazovky. 

Pipe | – roura mezi programy

Obecná idea (ve všech systémech stejná): 

program1 | program2

Postará se o to, že stdout (výstup) programu1 putuje ns stdin (vstup) programu2. Tedy to co “leze ven” z prvního, se stane vstupem pro druhý. 

Příklad z Linuxu:

ls | grep txt

ls vypíše obsah složky a grep txt ho dostane jako vstup aby v něm vyhledal “txt” a poskytl to jako finální výstup.

Důležité je, že ve většině shellů je do pípy přenášen jen stdout nikoliv stderr

Pozor, v PowerShell (Windows, Linux, macOS) nepředává text, ale .NET objekty.

Get-Process | Where-Object CPU -gt 10 | Sort-Object CPU -Descending

Když ale pipujete do externího programu (typicky klasické exe jako findstr, git), PowerShell ty objekty převádí na řetězce

ipconfig | findstr IPv4

PowerShell má navíc datové proudy 1–6 (oprotí běžným 0 – stdin, 1 – stdout a 2 – stderr):

1 – Success (běžný výstup)
2 – Error
3 – Warning
4 – Verbose
5 – Debug
6 – Information

Přesměrování: < a >

Základní významy (platí ve všech světech, jen drobné odchylky):

> – přesměruj stdout do souboru, soubor přepiš

ls > soubor.txt

ls vypisuje obsah složky, tady přesměrováním dojde k uložení výpisu do souboru. Soubor ale bude vytvořen znovu, pokud tedy existuje, bude přepsán.

>> – přesměruj stdout do souboru, připoj na konec

Pokud chcete aby výstup byl přidán na konec souboru (pokud existuje, jinak bude vytvořen), tak je nutné použít >>

< – čti stdin ze souboru místo z klávesnice

sort < soubor.txt

Vezme obsah souboru soubor.txt a pustí ho do sort, ten ho utřídí a výsledek zobrazí (protože půjde na stdout). 

2> – přesměruj stderr do souboru

Jak bylo naznačeno výše, pípa nepracuje s stderr, tedy chybovými hláškami. Můžete ale využít 2> a chybové výstupy ukládat do souboru.

2>&1 – přesměruj stderr tam, kam už jde stdout

ls > vse.log 2>&1

Speciální „černá díra“

/dev/null v Unixu, NUL ve Windows. Můžete používat například takto:

příkaz > /dev/null 2>&1   # zahodí všechen výstup (stdout i stderr)
příkaz > NUL 2>&1         # totéž ve Windows CMD

„Černá díra“ v PowerShellu

cmd | Out-Null

&> – stdout i stderr do jednoho souboru
|& – pipe pro stdout + stderr:

Nefunguje všude – bash/zsh, ale ne čisté POSIX sh

cmd &> vse.log
cmd |& grep error

Shrnutí v jedné tabulce (pozor, sestavila ChatGPT)

OperátorNázev / významUnix (bash/zsh)CMD/DOSPowerShell
``pipe / roura, pipelinestdout → stdinstdout → stdin
>přesměrování stdout, přepsat souboranoanopřesměruje success stream (1), alias Out-File
>>přesměrování stdout, připojit na konecanoanoano (append)
<přesměrování stdin ze souboruanoanofunguje, ale méně používané (častěji Get-Content)
2>přesměrování stderr / errorano (2> → stderr)ano (2> → stderr)ano (error stream 2)
2>&1stderr → tam, kam jde stdoutanoanofunguje (přesměruje stream 2 na cíl streamu 1)
&>stdout+stderr → souborbash/zsh rozšířenínene, místo toho *>
*>všechny streamy → souborneneano
/dev/null / NUL„černá díra“ pro výstup/dev/nullNULNUL, $null, Out-Null

Pár praktických příkladů

Unix/Linux/MacOS

# Spočítej, kolik řádků obsahuje "error" v logu
grep error /var/log/syslog | wc -l

# Ulož seznam souborů, chyby bokem
ls /etc > seznam.txt 2> chyby.txt

# Zahoď všechen výstup
příkaz  > /dev/null 2>&1

Windows CMD

REM Vyhledej "ERROR" ve výpisu služeb a ulož jen nalezené řádky
sc query | find "ERROR" > error_services.txt

REM Zahoď výstup i chyby
příkaz > NUL 2>&1

PowerShell

# Seznam procesů podle CPU
Get-Process | Where-Object CPU -gt 1 | Sort-Object CPU -Descending

# Ulož běžný výstup a chyby samostatně
příkaz 1> out.log 2> err.log

# Varování a chybové hlášky do souborů, výstup nech na obrazovce
příkaz 3> warnings.log 2> errors.log