it-swarm-eu.dev

Co dělá "3> & 1 1> & 2 2> & 3" ve skriptu?

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?

69
jsterr

Čí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:

  1. Vytvořte nový fd 3 a přejděte na fd 1
  2. Přesměrujte deskriptor 1 na deskriptor 2. Pokud bychom popisovač souboru neuložili do 3, ztratili bychom cíl.
  3. Přesměrujte deskriptor souboru 2 na deskriptor souboru 3. Nyní se přepnou deskriptory souborů jeden a dva.

Nyní, když program něco vytiskne do deskriptoru souboru 1, bude vytištěn do deskriptoru souboru 2 a naopak.

81
Ulrich Dangel

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í

20
Mikel

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

1