GNU/Linux >> Znalost Linux >  >> Linux

Pět způsobů použití operátorů přesměrování v Bash

Data se do počítače zadávají pomocí stdin (obvykle klávesnice) a výsledný výstup jde do stdout (obvykle skořápka). Tyto cesty se nazývají proudy . Je však možné změnit tato vstupní a výstupní umístění, což způsobí, že počítač získá informace odjinud než ze stdin nebo pošlete výsledky jinam než stdout . Tato funkce se nazývá přesměrování .

V tomto článku se dozvíte pět operátorů přesměrování, včetně jednoho pro stderr . Poskytl jsem příklady každého z nich a představil materiál způsobem, který můžete duplikovat na svůj vlastní systém Linux.

Běžný výstup> operátor

Přesměrovač výstupu je pravděpodobně nejuznávanější z operátorů. Standardní výstup (stdout ) je obvykle do okna terminálu. Například když zadáte date na obrazovce se zobrazí výsledný čas a datum.

[damon@localhost ~]$ date
Tue Dec 29 04:07:37 PM MST 2020
[damon@localhost ~]$

Je však možné přesměrovat tento výstup z stdout někam jinam. V tomto případě přesměruji výsledky do souboru s názvem specifications.txt . Potvrdím, že to fungovalo pomocí cat příkaz pro zobrazení obsahu souboru.

[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ cat specifications.txt 
Tue Dec 29 04:08:44 PM MST 2020
[damon@localhost ~]$ 

Problém s > přesměrovač spočívá v tom, že přepíše všechna existující data v souboru. V této fázi máte nyní date informace v specifications.txt soubor, že? Pokud zadáte hostname > specifications.txt , výstup bude odeslán do textového souboru, ale přepíše stávající informace o čase a datu z předchozích kroků.

[damon@localhost ~]$ hostname > specifications.txt 
[damon@localhost ~]$ cat specifications.txt 
localhost.localdomain
[damon@localhost ~]$ 

S > se snadno dostanete do problémů přesměrovač náhodným přepsáním existujících informací.

[ Čtenáři si také užili: 10 základních příkazů Linuxu, které potřebujete znát ]

Připojení k běžnému výstupu>> operátor

Příloha >> operátor přidá výstup k existujícímu obsahu místo jeho přepsání. To umožňuje přesměrovat výstup z více příkazů do jednoho souboru. Mohl bych například přesměrovat výstup date pomocí > a poté přesměrujte hostname a uname -r do specifications.txt soubor pomocí >> operátor.

[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ hostname >> specifications.txt 
[damon@localhost ~]$ uname -r >> specifications.txt 
[damon@localhost ~]$ cat specifications.txt 
Tue Dec 29 04:11:51 PM MST 2020
localhost.localdomain
5.9.16-200.fc33.x86_64
[damon@localhost ~]$ 

Poznámka :>> přesměrovač funguje i na prázdný soubor. To znamená, že byste mohl

ignorujte běžný > přesměrovač pro zmírnění možnosti přepsání dat a vždy se spoléhejte na >> místo toho přesměrovač. Dostat se do toho není špatný zvyk.

Běžný vstup

Vstupní přesměrovač získává data v proudu z daného zdroje. Programy obvykle přijímají vstup z klávesnice. Data však lze stáhnout z jiného zdroje, například ze souboru.

Je čas vytvořit příklad pomocí sort příkaz. Nejprve vytvořte textový soubor s názvem mylist.txt který obsahuje následující řádky:

cat
dog
horse
cow

Všimněte si, že zvířata nejsou jsou uvedeny v abecedním pořadí.

Co když je potřebujete uvést v pořadí? Obsah souboru můžete stáhnout do sort pomocí < operátor.

[damon@localhost ~]$ sort < mylist.txt 
cat
cow
dog
horse
[damon@localhost ~]$ 

Můžete se dokonce trochu zbláznit a přesměrovat setříděné výsledky do nového souboru:

[damon@localhost ~]$ sort < mylist.txt > alphabetical-file.txt
[damon@localhost ~]$ cat alphabetical-file.txt 
cat
cow
dog
horse
[damon@localhost ~]$ 

Běžná chyba 2> operátor

Stdout zobrazí očekávané výsledky. Pokud se objeví chyby, jsou spravovány jinak. Chyby jsou označeny jako deskriptor souboru 2 (standardní výstup je deskriptor souboru 1). Když program nebo skript negeneruje očekávané výsledky, vyvolá chybu. Chyba je obvykle odeslána na stdout , ale může být přesměrován jinam. stderr operátor je 2> (pro deskriptor souboru 2).

Zde je jednoduchý příklad s chybně napsaným ping příkaz:

[damon@localhost ~]$ png
bash: png: command not found...
[damon@localhost ~]$

Zde je stejný chybně napsaný příkaz s chybovým výstupem přesměrovaným na /dev/null :

[damon@localhost ~]$ png 2> /dev/null
[damon@localhost ~]$ 

Výsledná chybová zpráva je přesměrována na /dev/null místo stdout , takže se na obrazovce nezobrazí žádný výsledek ani chybová zpráva.

Poznámka :/dev/null nebo bit bucket , se používá jako odpadkový koš pro příkazový řádek. Nechtěný výstup lze přesměrovat do tohoto umístění, aby jednoduše zmizel. Například možná píšete skript a chcete otestovat některé z jeho funkčnosti, ale víte, že způsobí chyby, které vás v této fázi vývoje nezajímají. Můžete spustit skript a říct mu, aby přesměroval chyby na /dev/null pro pohodlí.

Potrubí | operátor

Ken Hess už má solidní článek o používání dýmky | operátora, takže zde ukážu pouze velmi rychlou ukázku.

Roura převezme výstup prvního příkazu a udělá z něj vstup druhého příkazu. Možná budete chtít vidět seznam všech adresářů a souborů v /etc adresář. Víte, že to bude dlouhý seznam a že většina výstupu se posune mimo horní část obrazovky. less příkaz rozdělí výstup na stránky a vy se pak můžete po stránkách posouvat nahoru nebo dolů a zobrazit výsledky. Syntaxe je vydat ls příkaz k výpisu obsahu /etc a poté pomocí potrubí odešlete tento seznam do less aby se dal rozdělit na stránky.

[damon@localhost ~]$ ls /etc | less

Kenův článek má mnohem více skvělých příkladů. Osobně jsem zjistil, že používám command | less a command | grep string nejčastěji.

[ Stáhnout nyní:Průvodce systémového administrátora skriptováním v Bash. ] 

Sbalit

Operátory přesměrování jsou velmi užitečné a doufám, že vám toto krátké shrnutí poskytlo nějaké triky pro manipulaci se vstupem a výstupem. Klíčem je zapamatovat si, že > operátor přepíše existující data.


Linux
  1. Jak používat Nginx k přesměrování

  2. Proč nemohu použít CD ve skriptu Bash?

  3. Který Shell bych měl použít – Tcsh vs Bash?

  1. Jak používat příkazy historie Bash

  2. Použít $[ Expr ] místo $(( Expr ))?

  3. Neobvyklé způsoby použití proměnných uvnitř Bash skriptů

  1. Použít rozšíření .sh nebo .bash pro skripty Bash?

  2. jak použít kill SIGUSR2 v bash?

  3. Jaké je použití $# v Bash