V předchozím příspěvku jsme si podrobně povídali o parametrech a možnostech. Dnes budeme hovořit o něčem zásadním ve skriptování shellu, což jsou Input, Output a Redirection.
Výstup ze skriptů shellu můžete zobrazit dvěma způsoby:
- Zobrazte výstup na obrazovce.
- Odeslat výstup do souboru.
Standardní deskriptory souborů
Vše je v Linuxu soubor a to zahrnuje vstup a výstup.
Každý proces může mít současně otevřeno devět deskriptorů souborů. Deskriptory souborů 0, 1, 2 jsou zachovány pro použití shellu bash.
0 STDIN.
1 STDOUT.
2 STDERR.
Výše uvedené deskriptory souborů můžete použít k řízení vstupu a výstupu.
Musíte plně porozumět těmto třem, protože jsou jako páteř vašeho skriptování v shellu. Proto podrobně popíšeme každý z nich.
STDIN
STDIN je zkratka pro standardní vstup, což je ve výchozím nastavení klávesnice.
STDIN, což je klávesnice, můžete nahradit souborem pomocí symbolu přesměrování vstupu (<), který odesílá data jako psaní na klávesnici. Žádná magie!!
Když napíšete příkaz cat bez ničeho, přijímá vstup ze STDIN. Každý řádek, který zadáte, příkaz cat vytiskne tento řádek na obrazovku.
STDOUT
STDOUT znamená standardní výstup, což je ve výchozím nastavení obrazovka.
Výstup můžete přesměrovat do souboru pomocí symbolu>>.
Pokud máme soubor obsahující data, můžete k němu připojit data pomocí tohoto symbolu takto:
pwd >> myfile
Výstup generovaný pwd je připojen k myfile, aniž by se smazal existující obsah.
Následující příkaz se pokusí přesměrovat výstup do souboru pomocí symbolu>.
ls –l xfile > myfile
V počítači nemám žádný soubor s názvem xfile, což generuje chybu, která se odešle na STDERR.
STDERR
Shell ve výchozím nastavení odesílá chyby na obrazovku.
Pokud potřebujete chyby přesměrovat do souboru protokolu místo toho, abyste jej posílali na obrazovku, můžete chyby přesměrovat pomocí symbolu přesměrování.
Chyby přesměrování
Chyby můžeme přesměrovat umístěním deskriptoru souboru, který je 2 před symbol přesměrování takto:
ls -l xfile 2>myfile
cat ./myfile
Jak vidíte, chyba je nyní v souboru a nic na obrazovce.
Chyby přesměrování a normální výstup
Chcete-li přesměrovat chyby a normální výstup, musíte každé předcházet správným deskriptorem souboru, jako je tento:
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
Výsledek příkazu ls je odeslán do souboru správného obsahu pomocí 1> symbol. A chybové zprávy byly odeslány do souboru errorcontent pomocí 2> symbol.
Normální výstup a chyby můžete přesměrovat do stejného souboru pomocí &> symbol jako tento:
ls –l myfile xfile anotherfile &> content
zde přesměrujeme chyby a normální výstup do souboru s názvem content.
Přesměrování výstupu
Existují dva způsoby přesměrování výstupu:
- Dočasné přesměrování.
- Trvalé přesměrování.
Dočasná přesměrování
Pro dočasná přesměrování můžete použít symbol>&2 takto:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
Takže pokud to spustíme, uvidíme oba řádky vytištěné normálně, protože, jak víme, chyby se ve výchozím nastavení zobrazují na obrazovce.
Chyby můžete přesměrovat do souboru takto:
./myscript 2> myfile
Shell skriptování je úžasné! Normální výstup je odeslán na obrazovku, zatímco echo zpráva se symbolem>&2 posílá chyby do souboru.
Trvalá přesměrování
Pokud máte mnoho dat, která je třeba přesměrovat, můžete mít trvalé přesměrování pomocí příkazu exec, jako je tento:
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
Pokud se podíváme na soubor s názvem outfile, uvidíme výstup echo řádků.
Přesměrujeme STDOUT na začátku, co třeba uprostřed skriptu, jako je tento:
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
Příkaz exec přesměruje všechny chyby do souboru myerror a my odešleme standardní výstup na obrazovku.
K přesměrování výstupu do souboru myfile používáme příkaz exec 1>myfile a nakonec chyby přejdou do souboru myerror pomocí symbolu>&2.
Přesměrování vstupu
Vstup můžete přesměrovat do souboru namísto STDIN pomocí příkazu exec takto:
exec 0< myfile
Tento příkaz říká shellu, aby vzal vstup ze souboru s názvem myfile namísto STDIN a zde je příklad:
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
Skriptování prostředí je snadné.
Víte, jak použít příkaz read k získání uživatelského vstupu. Pokud přesměrujete STDIN do souboru, příkaz read se pokusí číst ze STDIN, který ukazuje na soubor.
Někteří správci systému Linux používají tuto techniku ke čtení souborů protokolu ke zpracování a my probereme další způsoby, jak číst protokol v nadcházejících příspěvcích profesionálním způsobem.
Vytvoření vlastního přesměrování
Víte, že existuje devět deskriptorů souborů, pouze 3 z nich používáte pro vstup, výstup a chybu.
Zbývajících šest deskriptorů souborů je dostupných pro přesměrování vstupu a výstupu.
Můžeme použít příkaz exec k přiřazení deskriptoru souboru pro výstup, jako je tento:
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
Vytvoření deskriptorů vstupních souborů
Chcete-li přesměrovat deskriptory vstupního souboru, proveďte následující:
1- Uložte STDIN do jiného deskriptoru souboru.
2- Přesměrování do souboru.
3- Vraťte STDIN do původního umístění.
Podívejte se na následující kód, abyste porozuměli těmto krokům:
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
Uložili jsme STDIN do deskriptoru souboru 7 a přesměrovali STDIN do souboru.
STDIN se po iteraci přes řádky souboru vrátil do původního umístění.
Poslední příkaz čtení jen proto, abyste se ujistili, že STDIN je vráceno a vy můžete klávesnici normálně používat.
Zavřít deskriptory souborů
Když skript skončí, deskriptory souborů se automaticky uzavřou. Pokud chcete deskriptor souboru zavřít sami, přesměrujte deskriptor souboru na tento symbol &- bude zavřeno.
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
Jak vidíte, zobrazuje chybu špatného deskriptoru souboru, protože již neexistuje.
lsof Command
Příkaz lsof se používá k zobrazení seznamu všech otevřených souborů v systému a procesech na pozadí.
Na mnoha systémech Linux, jako je Fedora, je příkaz lsof umístěn pod /usr/sbin.
Toto jsou některé z důležitých možností pro příkaz lsof:
-p:pro ID procesu.
-d:pro deskriptor souboru.
PID procesu můžete získat pomocí proměnné $$.
Můžeme použít -a ke spojení výsledků volby -p a volby -d.
Nyní otestujte příkaz ze skriptu:
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
Shell skript vytvoří deskriptory souborů 4 a 5 pro zápis a 6 pro čtení.
Potlačení výstupu příkazu
Někdy nechcete vidět žádný výstup. Přesměrujeme výstup do černé díry což je /dev/null .
Chyby můžeme potlačit například takto:
ls -al badfile anotherfile 2> /dev/null
Pomocí stejného příkazu můžete soubor zkrátit, aniž byste jej zcela smazali.
cat /dev/null > myfile
Nyní rozumíte vstupu a výstupu, jak je přesměrovat, jak vytvořit deskriptor souboru a přesměrovat na něj.
Doufám, že se vám bude líbit. Vraťte se.
Děkuji.