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 010
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šimlBash 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