Widziałem ten wiersz w skrypcie:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Co jest
3>&1 1>&2 2>&3
robić? Wiem, że 1 = 2 = stdout i stderr, ale jakie są 3
i &
za?
Widziałem ten wiersz w skrypcie:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Co jest
3>&1 1>&2 2>&3
robić? Wiem, że 1 = 2 = stdout i stderr, ale jakie są 3
i &
za?
Odpowiedzi:
Liczby są deskryptorami plików i tylko trzy pierwsze (zaczynające się od zera) mają znormalizowane znaczenie:
0 - stdin
1 - stdout
2 - stderr
Tak więc każda z tych liczb w twoim poleceniu odnosi się do deskryptora pliku. Możesz przekierować deskryptor pliku do pliku za pomocą >
lub przekierować go do innego deskryptora pliku za pomocą>&
3>&1
W linii poleceń stworzy nowy deskryptor pliku i przekierować go 1
co jest STDOUT
. Teraz 1>&2
przekieruje deskryptor pliku 1 do STDERR
i 2>&3
przekieruje deskryptor pliku 2 do 3, który jest STDOUT
.
Więc w zasadzie przeszedłeś STDOUT
i STDERR
są to następujące kroki:
Teraz, jeśli program wydrukuje coś do deskryptora pliku 1, zostanie to wypisane do deskryptora pliku 2 i odwrotnie.
Zamiana stdout
i stderr
.
>name
oznacza przekierowanie wyjścia do pliku name
.
>&number
oznacza przekierowanie wyjścia do deskryptora pliku number
.
&
Potrzebne jest więc , aby powiedzieć powłoce, że masz na myśli deskryptor pliku, a nie nazwę pliku.
Deskryptor pliku to liczba odnosząca się do już otwartego pliku. Standardowe są 0
dla standardowego wejścia, 1
dla standardowego wyjścia lub 2
dla standardowego błędu. Możesz także użyć dowolnej innej liczby, która utworzy nowy deskryptor pliku, podobnie jak podczas tworzenia nowej zmiennej za pomocą var=value
.
Domyślnie zarówno deskryptor pliku, jak 1
i 2
przejdź do /dev/tty
, więc jeśli uruchomisz somecommand 3>&1 1>&2 2>&3
nową powłokę, nic to nie zmieni (z wyjątkiem teraz, gdy masz deskryptor pliku nr 3).
Ale jeśli gdzieś wcześniej w skrypcie dokonuje przekierowania za pomocą exec (np. exec 2>error.log
), Lub skrypt jest uruchamiany z linii poleceń zawierającej przekierowanie (np. ./thescript 2>error.log
), Wówczas zamiana stdout i stderr zrobi coś.
W twoim konkretnym przypadku polecenie, które ma zamienione stdout i stderr, to dialog
. Widzę, patrząc na stronę podręcznika
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
więc być może osoba, która napisała skrypt, chce dialog
, aby stdout
z stderr
jakiegoś powodu wynik był wyświetlany.
Zobacz także Kolejność przekierowań
Autor skryptów zdefiniował FD 3, takie jak:
exec 3<> File.txt
Otwórz „File.txt” i przypisz do niego fd 3. Maksymalna liczba deskryptorów plików: 255
read -n 4 <&3
Czytaj tylko 4 znaki.
echo -n . >&3
Wpisz tam przecinek dziesiętny.
exec 3>&-
Zamknij fd 3.
cat File.txt
==> 1234,67890