Saya melihat baris ini dalam sebuah skrip:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
apa yang
3>&1 1>&2 2>&3
perbuatan? Saya tahu bahwa 1 = stdout dan 2 = stderr, tetapi untuk apa 3
dan &
untuk apa?
Jawaban:
Angka-angka adalah deskriptor file dan hanya tiga yang pertama (dimulai dengan nol) yang memiliki makna standar:
Jadi masing-masing angka ini dalam perintah Anda merujuk ke deskriptor file. Anda bisa mengarahkan file descriptor ke file dengan
>
atau mengarahkannya ke deskriptor file lain dengan>&
Di
3>&1
dalam baris perintah Anda akan membuat deskriptor file baru dan mengarahkan ulang ke1
yang adaSTDOUT
. Sekarang1>&2
akan mengarahkan file deskriptor 1 keSTDERR
dan2>&3
akan mengarahkan file deskriptor 2 ke 3STDOUT
.Jadi pada dasarnya Anda beralih
STDOUT
danSTDERR
, ini adalah langkah-langkahnya:Sekarang jika program mencetak sesuatu ke deskriptor file 1, itu akan dicetak ke deskriptor file 2 dan sebaliknya.
sumber
Bertukar
stdout
danstderr
.>name
berarti mengarahkan output ke filename
.>&number
berarti redirect output ke file descriptornumber
.Jadi
&
diperlukan untuk memberitahu shell maksud Anda deskriptor file, bukan nama file.Deskriptor file adalah angka yang merujuk ke file yang sudah terbuka. Yang standar adalah
0
untuk input standar,1
untuk output standar atau2
untuk kesalahan standar. Anda juga dapat menggunakan nomor lain, yang akan membuat deskriptor file baru, seperti saat Anda membuat variabel baru denganvar=value
.Secara default, kedua file descriptor
1
dan2
pergi ke/dev/tty
, jadi jika Anda menjalankansomecommand 3>&1 1>&2 2>&3
shell baru, itu tidak mengubah apa pun (kecuali sekarang Anda memiliki file deskriptor nomor 3).Tetapi jika suatu tempat sebelumnya dalam skrip melakukan pengalihan menggunakan exec (misalnya
exec 2>error.log
), atau skrip dijalankan dengan baris perintah termasuk pengalihan (mis../thescript 2>error.log
), Maka swapping stdout dan stderr akan melakukan sesuatu.Dalam kasus spesifik Anda, perintah yang mengganti stdout dan stderr adalah
dialog
. Melihat halaman manualnya , saya mengertijadi mungkin orang yang menulis skrip itu ingin
dialog
keluaranstdout
bukanstderr
karena alasan tertentu.Lihat juga Urutan pengalihan
sumber
Penulis skrip mendefinisikan fd 3 seperti:
Buka "File.txt" dan tetapkan fd 3 untuk itu. Deskriptor file maksimum: 255
Baca hanya 4 karakter.
Tulis titik desimal di sana.
Tutup fd 3.
==> 1234.67890
sumber