Pokud vám vyhovuje přesměrování výstupu a vstupu, vysvětlení je opravdu docela snadné.
Command1 | Command2
dělá totéž jako
Command1 > tempfile
Command2 < tempfile
ale bez tempfile
. Výstup Command1
je přímo připojen ke vstupu Command2
a přenos proběhne v paměti.
Následující text je trochu zjednodušen, aby pomohl novým uživatelům.
Nejprve je nutné porozumět konceptu standardního vstupu a standardního výstupu.
V Linuxu a dalších operačních systémech podobných UNIXu má každý proces standardní vstup (stdin
) a standardní výstup (stdout
). Obvyklá situace je, že stdin
je vaše klávesnice a stdout
je vaše obrazovka nebo okno terminálu.
Když tedy spustíte ls
, bude to hodit jeho výstup na stdout
. Pokud neuděláte nic jiného, přejde na vaši obrazovku nebo okno terminálu a vy si to prohlédnete.
Nyní některé příkazy Linuxu interagují s uživatelem a používají stdin
Chcete-li to provést, váš textový editor je jedním z nich. Čte se z stdin
přijímat vaše stisky kláves, dělat věci a pak zapisovat věci na stdout
.
Existují však také neinteraktivní nebo „filtrační“ příkazy, které NEfungují interaktivně, ale chtějí hromadu dat. Tyto příkazy vezmou vše stdin
má, udělejte s tím něco a pak to hodte na stdout
Podívejme se na další příkaz s názvem du
- znamená využití disku. du /usr
, například vytiskne (na stdout
jako každý jiný příkaz Linuxu) seznam všech souborů v tomto adresáři a jejich velikost:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Jak můžete hned říct, není seřazený a pravděpodobně ho chcete seřadit podle velikosti.
sort
je jedním z těch "filtračních" příkazů, které převezmou spoustu věcí z stdin
a seřadit.
Takže, když uděláme toto:
# du /usr | sort -nr
dostaneme toto, což je o něco lepší:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
A nyní můžete vidět, že "potrubí" spojuje stdout
jednoho příkazu na stdin
jiného. Obvykle jej použijete v situacích, jako je tato, kdy chcete filtrovat, třídit nebo jinak manipulovat s výstupem příkazu. Pokud chcete zpracovat výstup pomocí více příkazů typu filtru, mohou být kaskádovány.
Pokud zadáte sort
sám se bude stále snažit číst z stdin
. Od stdin
je připojen k vaší klávesnici, bude čekat, až budete psát a zpracovávat věci, dokud nestisknete Control-D. Nebude vás vyzývat, protože ve skutečnosti není určen k interaktivnímu použití.
Program může zjistit, zda stdin
je interaktivní nebo ne, takže některé programy se mohou chovat jinak, pokud je spustíte samy nebo na konci kanálu.
Také propojení programu, který funguje pouze interaktivně, například vi
, bude mít za následek špatný čas.
Roury se od přesměrování liší v tom, že data se míchají z jednoho příkazu na druhý, aniž by byla někde uložena. Takže ve výše uvedeném příkladu du
výstup není nikde uložen. Ve většině případů to u rour nechcete, protože důvodem použití rour je nějakým způsobem zpracovat výstup příkazu – ale existuje příkaz tee
který vám umožní mít svůj dort a sníst ho také, zkopíruje to, co obdrží z stdin
na obě stdout
a soubor dle vašeho výběru. Pravděpodobně to můžete udělat také z bash
s nějakou tajemnou syntaxí zahrnující ampersandy a závorky, o kterých nevím.
Opravdu, pokud chcete vědět, co roury dělají a jaký je rozdíl mezi> a |, přejděte do adresáře se spoustou souborů a
z terminálu ls
vs ls | more
(nebo to uděláte z Windows pomocí DIR a DIR | MORE)
Pokud jste použili> more, uvidíte, že vytvoří soubor nazvaný 'more' místo odeslání výstupu ls příkazu 'more'. Takže pokud by někdo udělal>více, byla by to pravděpodobně chyba, jeden by neudělal>více vy byste udělal>soubor1. More je dobře známý příkaz.
$ grep a
$ soubor kočky1 | grep aabc
grep se 2 parametry je soubor vzoru grep. grep s jedním parametrem je vzor grep. A můžete mu poslat soubor tak, že do něj pošlete obsah souboru, nebo pomocí <. Pokud použijete <, napíšete nejprve název příkazu a poté název souboru za příkazem tak
Mnoho příkazů také bere jako vstup soubor, takže grep soubor1 bude fungovat stejně jako soubor cat1 | grep a a grep a
Ještě před 15 lety jsem dělal dýmky (|) a> na DOSu.
Abych shrnul jak | se liší od - Ráma je umístěna mezi 2 příkazy leží mezi příkazem a souborem.> je výstupem do souboru.