GNU/Linux >> Znalost Linux >  >> Linux

Shell Scripting Part4 – Vstup, výstup a přesměrování

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.


Linux
  1. Čtěte a zapisujte data odkudkoli s přesměrováním v terminálu Linux

  2. Přesměrování a výstup potrubí?

  3. Io Redirection and the Head Command?

  1. Práce s Input Output a přesměrováním chyb v Linuxu

  2. Přesměrování výstupu příkazu do souboru a terminálu

  3. Použití rz a sz pod linuxovým shellem

  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Přesměrování vstupu/výstupu v Linuxu/Unixu

  3. Deskriptory souborů a skriptování prostředí?