GNU/Linux >> Znalost Linux >  >> Linux

Co znamená symbol linux pipe | dělat?

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.

slouží také k propojení příkazu a souboru, nikoli příkazu k příkazu. Ale zatímco> posílá výstup příkazu do souboru,

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


Linux
  1. Zvládněte příkaz Linux ls

  2. Jak zjistit, co dělá příkaz Linuxu

  3. Co znamená ve výstupu Ps?

  1. Co znamená &na konci linuxového příkazu?

  2. Co znamená symbol šipky (->) na příkazovém řádku?

  3. Co má příkaz export dělat v Linuxu?

  1. Co znamená - v tomto linuxovém příkazu?

  2. Jaký je ekvivalent linuxového ~ (tilda) ve Windows?

  3. Co dělá -e v bash shebang?