Dalam skrip, kesalahan biasanya dikirim ke file deskriptor 2 dengan &2
, yaitu:
echo "error" >&2
Kadang /dev/stderr
- kadang digunakan sebagai gantinya:
echo "error" > /dev/stderr
Melihat /dev/stderr
, saya melihat bahwa itu hanya sebuah symlink /proc/self/fd/2
, yang pada gilirannya adalah symlink ke /dev/pts/5
(pada terminal saya saat ini).
Tampak sedikit rumit. Apakah ada logika di balik itu?
Apakah menggunakan /dev/stderr
dan &2
setara?
Apakah ada yang lebih disukai daripada yang lain?
portability
stderr
Martin Vegter
sumber
sumber
echo "error" >2
membuat file dengan nama2
dan kontenerror
.>2
, atau>&2
?Jawaban:
Perangkat khusus
/dev/stderr
bersifat khusus sistem, sedangkan deskriptor file2
(bukan perangkat khusus/proc/self/fd/2
) bersifat portabel. Jika Anda ingin menulis kode non-portabel, perangkat khusus itu adalah tempat yang baik untuk memulai.Ada beberapa sistem dengan
/dev/stderr
: Linux, tentu saja, dan OSX . Tetapi OSX tidak memiliki/proc
sistem file, dan ini/dev/stderr
adalah tautan ke/dev/fd/2
.Bacaan lebih lanjut:
sumber
2> bla.log
yang akan berfungsi selama Anda mem-pipe2
dan bukan hard-code/dev/stderr
. Pada dasarnya2
tidak perlu berupastderr
output.Di bash, dan shell lain, cara untuk mengarahkan sesuatu ke kesalahan standar adalah menggunakan
>&2
. Bash terbuka/dev/stderr
sebagai deskriptor file2
. Deskriptor file direferensikan oleh di&N
manaN
nomor deskriptor. Jadi,echo error >&2
akan mencetakerror
ke kesalahan standar, ke/dev/stderr
.Itu juga akan terbuka
/dev/stdout
sebagai file descriptor1
. Ini artinya Anda bisa melakukannyaecho output >&1
. Namun, karena semuanya dicetak ke output standar secara default, itu samaecho output
dengan sendirinya.Sekarang
2>
berbeda. Di sini, Anda mengarahkan output kesalahan dari perintah di tempat lain. Jadi,2>file
berarti "redirect apa pun yang dicetak ke file descriptor 2 (standard error) kefile
".sumber
Anda benar,
>&2
lebih langsung dan sempurna "idiomatik". Mereka harus setara, jadi tidak ada alasan khusus untuk digunakan>/dev/stderr
. Kecuali itu, jika seseorang membaca tidak tahu apa yang dilakukannya, salah satunya mungkin lebih mudah untuk diketahui daripada yang lain :-). Tapi secara umum saya sarankan Anda gunakan>&2
./ dev / stderr bisa berguna ketika program akan menulis kesalahan ke nama file yang ditentukan, tetapi tidak mendukung stderr. Jelas ini sedikit dibuat-buat; / dev / stdout jauh lebih bermanfaat. (Saya baru-baru ini menemukan
mysql_safe
skrip wrapper tidak akan menulis kesalahan ke konsol; sayangnya itu juga ingin mengubah izin pada file log kesalahan, jadi menggunakan / dev / stderr menyebabkan beberapa peringatan berlebihan).sumber