Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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}"

  1. Seznam otevřených souborů procesu lze zobrazit pomocí lsof. ↩