Viděl jsem tento řádek ve skriptu:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Co je to?
3>&1 1>&2 2>&3
děláte? Vím, že 1 = stdout a 2 = stderr, ale jaké jsou 3
a &
pro?
Čísla jsou deskriptory souborů a pouze první tři (počínaje nulou) mají standardizovaný význam:
0 - stdin
1 - stdout
2 - stderr
Každé z těchto čísel v příkazu tedy odkazuje na popisovač souboru. Můžete buď přesměrovat popisovač souboru do souboru pomocí >
nebo přesměrovat na jiný deskriptor souboru pomocí >&
The 3>&1
ve vašem příkazovém řádku vytvoří nový deskriptor souboru a přesměruje jej na 1
což je STDOUT
. Nyní 1>&2
přesměruje deskriptor souboru 1 na STDERR
a 2>&3
přesměruje popisovač souboru 2 na 3, což je STDOUT
.
Takže v podstatě jste přepnuli STDOUT
a STDERR
, jedná se o tyto kroky:
Nyní, když program něco vytiskne do deskriptoru souboru 1, bude vytištěn do deskriptoru souboru 2 a naopak.
Zaměňuje se stdout
a stderr
.
>name
znamená přesměrování výstupu do souboru name
.
>&number
znamená přesměrování výstupu do deskriptoru souboru number
.
Takže &
je potřeba, aby Shell řekl, že máte na mysli deskriptor souboru, ne název souboru.
Deskriptor souboru je číslo, které odkazuje na již otevřený soubor. Standardní jsou 0
pro standardní vstup, 1
pro standardní výstup nebo 2
pro standardní chybu. Můžete také použít jakékoli jiné číslo, které vytvoří nový deskriptor souboru, stejně jako když vytvoříte novou proměnnou pomocí var=value
.
Ve výchozím nastavení oba popisovače souborů 1
a 2
jít do /dev/tty
, takže pokud spustíte somecommand 3>&1 1>&2 2>&3
v novém prostředí Shell nic nezmění (až na to, že nyní máte popisovač souborů číslo 3).
Pokud ale někde dříve ve skriptu provede přesměrování pomocí exec (např. exec 2>error.log
) nebo je skript spuštěn z příkazového řádku včetně přesměrování (např. ./thescript 2>error.log
), pak výměna stdout a stderr něco udělá.
Ve vašem konkrétním případě je příkaz, který má zaměněn stdout a stderr, dialog
. Když se podívám na jeho manuálovou stránk , vidím
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
takže snad osoba, která napsala skript, chce z nějakého důvodu výstup dialog
přejít na stdout
místo stderr
.
Viz také Pořadí přesměrování
Spisovatel skriptů definoval fd 3, jako například:
exec 3<> File.txt
Otevřete soubor File.txt a přiřaďte k němu fd 3. Maximální popisovače souborů: 255
read -n 4 <&3
Číst pouze 4 znaky.
echo -n . >&3
Zde zadejte desetinnou čárku.
exec 3>&-
Zavřít fd 3.
cat File.txt
==> 1234,67890