Mengapa mengarahkan ulang STDERR ke / dev / null dilakukan dengan cara ini?


29

Ini tidak masuk akal bagi saya.

wibble > /dev/null 2>&1

Saya pikir akan lebih masuk akal jika sesuatu seperti ini:

wibble 2>&1 > /dev/null

Dengan kata lain

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Apa pemikiran di balik urutan pengalihan perintah xxx > /dev/null 2>1?


6
Anda mungkin juga menemukan penjelasan ini bermanfaat.
rozcietrzewiacz

Terima kasih @rozcietzewiacz yang benar-benar menjelaskan pertanyaan saya persis
whoami

1
Ada bagian yang sangat bagus di tengah halaman di Greg's Wiki: "Jika Anda masih bingung pada saat ini, itu mungkin karena Anda memulai dengan kesalahpahaman tentang bagaimana FD bekerja, dan Anda belum bisa menghilangkan kesalahpahaman itu. namun. Jangan khawatir - ini adalah kesalahpahaman yang sangat umum, dan Anda tidak sendirian. ... Banyak orang berpikir bahwa 2>&1entah bagaimana "menyatukan" atau "menyatukan" atau "menikahi" kedua FD, sehingga setiap perubahan [berikutnya] ke salah satu dari mereka menjadi perubahan ke yang lain. Ini bukan masalahnya. "
G-Man Mengatakan 'Reinstate Monica'

Jawaban:


41

Pengalihan diproses dari kiri ke kanan. Jika kamu melakukan

2>&1 1> /dev/null

Redirect pertama stderrmenunjukkan aliran yang stdoutmenunjuk pada waktu itu (yang pada dasarnya adalah tty Anda). Itu tidak membuat stderralias stdout.

Kemudian stdoutdiarahkan ke ember bit. The stdoutredirect tidak mempengaruhi sebelumnya stderrredirect. stderrmasih mengacu pada tty Anda.

Begitu:

ls file_that_doesnt_exist 2>&1 1> /dev/null

hanya akan mencetak pesan kesalahan pada terminal Anda.

The bashhalaman dokumentasi pengalihan menyebutkan ini secara eksplisit:

Perhatikan bahwa urutan pengalihan signifikan. Misalnya, perintahnya

          ls > dirlist 2>&1

mengarahkan output standar dan kesalahan standar ke file dirlist, sementara perintah

          ls 2>&1 > dirlist

mengarahkan hanya output standar ke dirlist file, karena kesalahan standar diduplikasi dari output standar sebelum output standar dialihkan ke dirlist .


3
Yay memecahkan teka-teki saya. Saya masih berpikir secara logis itu membingungkan. tetapi saya menemukan bagian lain pada halaman yang sama yang menarik &>/dev/nullsecara semantik setara dengan/dev/null 2>&1
whoami

1
Harus ditekankan bahwa halaman yang Anda bicarakan adalah bagian dari Bash Reference Manual. Ini, jelas, menggambarkan bash . Ada cangkang lain di dunia, berbeda dari bash, dan &>dan >&(bila tidak digunakan dalam konteks 2>&1atau >&2, dll.) Adalah bash-isme dan tidak standar . Mereka tidak boleh digunakan dalam skrip shell yang Anda inginkan portabel.
G-Man Mengatakan 'Reinstate Monica'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.