GNU/Linux >> Znalost Linux >  >> Linux

Bash přesměrování vysvětleno s příklady

Přesměrování a potrubí jsou dvě užitečné funkce ve skriptování bash, které správci systému a vývojáři často používají. V této příručce probereme, co je přesměrování bash a jak pracovat s přesměrováním v Bash s ukázkovými příkazy.

Než pochopíte, jak přesměrování funguje, je důležité zjistit, co je deskriptor souboru.

Co je to deskriptor souboru?

Když otevřete soubor v Linuxu, každému souboru bude přiřazeno celé číslo a tato informace je uložena v jádře. Tímto způsobem jádro ví, jaké soubory jsou otevřeny a který proces soubory otevřel. Přiřazené celé číslo je to, co nazýváme deskriptor souboru (zkráceně FD).

Ve výchozím nastavení začíná každý program se třemi deskriptory souborů.

  • FD 0 -> Standardní vstup (stdin) -> Klávesnice
  • FD 1 -> Standardní výstup (Stdout) -> Displej (Terminál)
  • FD 2 -> Standardní chyba (Stderr) -> Displej (Terminál)

Deskriptory souborů můžete vidět v /dev adresář:

$ ls -l /dev/std* lrwxrwxrwx 1 kořenový kořen 15. srpna 27 21:32 /dev/stderr -> /proc/self/fd/2lrwxrwxrwx 1 kořenový adresář 15. srpna 27 21:32 /dev/stdin -> /proc/self/fdwx1 root 15. srpna 27 21:32 /dev/stdout -> /proc/self/fd/1

Stdin (FD0) získává vstup z klávesnice. stdout (FD1) a stderr (FD2) jsou odeslány do terminálu. Při používání Pipes and Redirections můžete změnit způsob, jakým je předáván vstup a kam jsou odesílány výstupy a chyby.

Přesměrování výstupu do souboru

Jak bylo uvedeno dříve, výstup (stdout) a chyba (stderr) libovolného programu je odeslána do terminálu. Můžete použít operátor přesměrování ">” zapsat stdout a stderr do souboru.

Podívejte se na níže uvedený příklad. Spouštím uname -mrs a přesměrování výstupu do souboru s názvem uname.log .

$ uname -mrs> uname.log
$ cat uname.log 
Linux 5.10.0-8-amd64 x86_64

Pozor: Při použití ">" operátor, pokud soubor není dostupný, bude vytvořen. A pokud soubor již existuje, bude přepsán novým obsahem.

Můžete také použít číslo deskriptoru souboru pro stdout(1) před operátor přesměrování pro přesměrování výstupu do souboru.

$ uname -mrs 1> uname.log

Jak jsem již zmínil, jediný operátor přesměrování (> ) přepíše obsah souboru pouze v případě, že soubor již existuje. Pokud však chcete přidat obsah místo přepsání do stejného souboru, použijte operátor dvojitého přesměrování (tj. >> ). Také zde můžete použít stdout file deskriptor(1).

$ whoami>> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log Linux 5.10.0-8-amd64 x86_64ostechnix/bin/bash

Jak zacházet se Stderrem

Každý program generuje výstup i chybu a obojí je odesláno do terminálu. V mnoha případech možná budete chtít chybu buď ignorovat, nebo chyby izolovat a přesměrovat je do samostatného souboru pro řešení problémů.

Vezměme si jednoduchý příklad spuštění ls příkaz, abyste viděli, jak to funguje. Snažím se vypsat dva soubory, z nichž je přítomen pouze jeden. Jak jsem již řekl, dostávám svou chybu i výstup v terminálu.

$ ls -l uname.log u1.log ls:nelze získat přístup k 'u1.log':Žádný takový soubor nebo adresář-rw-r--r-- 1 ostechnix ostechnix 48. srpna 27 07:37 uname.log

Používám stejný ls příkaz znovu, ale tentokrát přesměrování výstupu do souboru. Jak můžete vidět z výstupu > operátor přesměruje stdout(1) do souboru, ale stderr(2) je odeslán do terminálu.

$ ls -l uname.log u1.log> ls.op ls:nelze získat přístup k 'u1.log':Žádný takový soubor nebo adresář

K přesměrování stderr do souboru použijte "2>" operátor. Je povinné použít deskriptor souboru pro stderr(2) před operátorem přesměrování>, který odešle samotnou chybu do souboru.

$ ls -l uname.log u1.log> ls.op 2> ls.err
$ cat ls.err ls:nelze získat přístup k 'u1.log':Žádný takový soubor nebo adresář

Nyní jsou stdout a stderr zapsány do samostatných souborů. Můžete také odeslat stdout a stderr do jednoho souboru.

$ ls -l uname.log u1.log 1> ls.op 2> ls.op

Od bash 4.4 , můžete také použít &> sign pro přesměrování stdout i stderr do souboru.

$ ls -l uname.log u1.log &> ls.op

Co je /dev/null?

Null je znakový speciální soubor, který přijímá vstup a zahazuje vstup a nevytváří žádný výstup. Jednoduše řečeno, null zahodí vše, co na něj přesměrujete.

$ ls -l /dev/null crw-rw-rw- 1 kořenový kořen 1, 3. srpna 27 06:01 /dev/null

Proč při přesměrování záleží na nule? Možná se divíte. V některých případech možná nebudete chtít stdout nebo stderr tisknout nebo ukládat. V takovém případě můžete přesměrovat buď stdout nebo stderr na /dev/null, čímž se zahodí proud vstupu.

$ datum> /dev/null$ datum 1> /dev/null # Stdout to Null$ dateee 2> /dev/null # ŠPATNÝ PŘÍKAZ, datum Stderr to Null$ &> /dev/null # Stdout/Stderr to Null

Přesměrování vstupu v Bash

Podobně jako přesměrováváte výstup a chybu do souboru, můžete také předat vstupy příkazu pomocí operátoru přesměrování vstupu (< ).

Začněme jednoduchým programem na počítání slov. Zde přesměruji obsah ostechnix.txt soubor k počtu slov, abyste zjistili počet řádků.

$ wc -l <​​ostechnix.txt  10

Při přesměrování vstupu můžete také předat deskriptor souboru stdin (0).

$ wc -l 0 10

Operátory přesměrování vstupu a výstupu můžete kombinovat, jak je uvedeno níže.

$ wc -l <​​otechnix.txt &> /tmp/wc.op
$ cat /tmp/wc.op  10

Přesměrování vstupu bude použito spolu se smyčkou while ke čtení obsahu souboru řádek po řádku.

Podívejte se na níže uvedený příklad. Předávám /etc/passwd soubor jako vstup do while příkaz. Zde si read příkaz načte řádek po řádku a uloží jej do proměnné VAL a dále ve smyčce je zapsána podmínka pro kontrolu, zda je uživatel dostupný.

při čtení VAL; do NAME=$(echo $VAL | awk -F ":" '/1/ {print $1}' ) if [[ $NAME ="karthick" ]] pak echo "User spotted" fidone   

Skript k nalezení systémového uživatele

Nahraďte "karthick" ve výše uvedeném kódu svým uživatelským jménem systému. Uložte soubor a zavřete jej.

Toto není optimální způsob, jak dosáhnout úkolu najít uživatele, ale pro demonstrační účely to postačí.

Nyní vytvořte spustitelný skript a spusťte jej:

$ chmod +x ostechnix.sh 
$ ./ostechnix.sh 
Uživatel všiml

Bash podporuje jinou formu přesměrování vstupu známou jako Heredoc . Další podrobnosti naleznete v následující příručce:

  • Výukový program Bash Heredoc pro začátečníky

Shrnutí

V této příručce jsme se naučili několik důležitých skriptovacích konceptů, jako je co je přesměrování Bash, co je deskriptor souboru, jak přesměrovat výstup do souboru, jak zacházet se stderr, co je /dev/null a jak se používá v Bash. přesměrování a nakonec jsme průvodce ukončili přesměrováním vstupu v Bash.

Pokud se chcete naučit skriptování v jazyce Bash, měli byste se naučit a seznámit se s pojmy vysvětlenými zde. Abyste se cítili pohodlně, doporučuji vám vyzkoušet ve vašem systému všechny příkazy, které jsme ukázali v tomto článku.

Pokud máte nějakou zpětnou vazbu nebo nějaké tipy, které pomohou linuxové komunitě a našim čtenářům naučit se bash skriptování, dejte nám vědět v sekci komentářů níže.

Doporučené čtení:

  • Bash Scripting – proměnné vysvětlené na příkladech
  • Bash Scripting – funkce vysvětlené na příkladech
  • Bash Scripting – pro smyčku vysvětlenou s příklady
  • Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady
  • Příkaz Bash Echo vysvětlený s příklady v Linuxu
  • Seznam užitečných klávesových zkratek Bash
  • Rozdíl mezi definováním proměnných Bash s exportem a bez exportu

Linux
  1. Jak napsat Bash skript s příklady

  2. Bash If-Else prohlášení s příklady

  3. Jak vytvořit a připojit souborový systém Btrfs (vysvětleno na příkladech)

  1. Bash HereDoc výukový program s příklady

  2. Linuxový příkaz cksum vysvětlený pro začátečníky (s příklady)

  3. Linux WC příkaz s příklady

  1. 35 příkladů skriptů Bash

  2. Časová razítka souborů Linux vysvětlena s příklady

  3. Příkaz Bash Echo vysvětlený s příklady v Linuxu