File descriptory a přesměrování
File descriptor (FD) je přirozené číslo unikátně identifikující otevřený soubor procesu (v případě skriptu je to proces shellu skript provádějící).1 Deskriptory 0, 1 a 2 jsou rezervovány pro standardní vstup, standardní výstup a standardní chybový výstup. Ve skriptu máme ještě přístup k FD s čísly 3 až 8. Abychom mohli FD použít, musíme jej přesměrovat do/ze souboru či jiného FD. Eventuálně ovšem posloupnost přesměrování musí končit v souboru nebo některém standardním FD.
Při přesměrování z/do FD jej identifikujeme jeho číslem, před nějž vložíme znak
&. Tedy například
echo "go to the fd" >&3 # presmerujeme vystup do FD 3
grep 'pattern' <&4 # grep cte z FD 4
Přesměrování FD, které platí po zbytek skriptu provedeme pomocí příkazu exec.
Při přesměrování do/z souboru je argumentem exec výraz, který je analogický
běžnému přesměrování, jenom na místě příkazu je FD. Například
exec 3>test.txt
Lze přesměrovat i FD do jiného FD, například
exec 3>&1 # presmeruje FD 3 na standardni vystup
Pokud chceme FD zavřít, přesměrujeme jej do &-, například
exec 3>&- # zavreme FD 3.
Další příklad ukazuje, jak dočasně pro část skriptu přesměrovat stdout/stdin
do/z souboru, a potom jej zpět obnovit. (Pomáhá dívat se na FD jako na proměnné,
kterým přesměrováním přiřazujeme vstupní nebo výstupní místo).
#
# presmerovani stdout
#
exec 3>&1 # v deskriptoru 3 si "pamatujeme" stdout
exec 1>foo.txt # stdout presmerujeme do souboru
echo "toto skonci v souboru foo.txt"
exec 1>&3 # tady "obnovime" puvodni stdout
echo "toto se objevi v konzoli"
#
# presmerovani stdin
#
exec 6<&0 # uchovame si stdin
exec 0<bar.txt # presmerujeme do stdin soubor
# cyklus ted cte ze souboru
count=1
while read line
do
echo "radek ${count}: ${line}"
count=$[${count} + 1]
done
exec 0<&6 # obnovime stdin z FD 6
# otestujeme puvodni hodnotu stdin
read -p "vstup: " var
echo "zadal jsi: ${var}"
-
Seznam otevřených souborů procesu lze zobrazit pomocí
lsof. ↩