Status keluar dari pipa adalah status keluar dari perintah sebelah kanan. Status keluar dari perintah sebelah kiri diabaikan.
(Catatan yang which lss | echo $?
tidak menunjukkan ini. Anda akan menjalankan which lss | true; echo $?
untuk menunjukkan ini. Dalam which lss | echo $?
, echo $?
melaporkan status perintah terakhir sebelum pipa ini.)
Alasan shell berperilaku seperti ini adalah bahwa ada skenario yang cukup umum di mana kesalahan di sisi kiri harus diabaikan. Jika sisi kanan keluar (atau lebih umum menutup input standarnya) ketika sisi kiri masih menulis, maka sisi kiri menerima sinyal SIGPIPE. Dalam hal ini, biasanya tidak ada yang salah: sisi kanan tidak peduli dengan data; jika peran sisi kiri semata-mata untuk menghasilkan data ini maka tidak masalah untuk menghentikannya.
Namun, jika sisi kiri mati karena alasan lain selain SIGPIPE, atau jika pekerjaan sisi kiri tidak hanya menghasilkan data pada output standar, maka kesalahan di sisi kiri adalah kesalahan asli yang harus dilaporkan.
Di sh polos, satu-satunya solusi adalah dengan menggunakan pipa bernama.
set -e
mkfifo p
command1 >p & pid1=$!
command2 <p
wait $pid1
Dalam ksh, bash, dan zsh, Anda dapat menginstruksikan shell untuk membuat pipa keluar dengan status bukan nol jika ada komponen pipa keluar dengan status bukan nol. Anda perlu mengatur pipefail
opsi:
- ksh:
set -o pipefail
- pesta:
shopt -s pipefail
- zsh:
setopt pipefail
(atau setopt pipe_fail
)
Di mksh, bash dan zsh, Anda bisa mendapatkan status setiap komponen pipa menggunakan variabel PIPESTATUS
(bash, mksh) atau pipestatus
(zsh), yang merupakan larik yang berisi status semua perintah dalam pipa terakhir (generalisasi dari $?
).
which lss | echo $?
,echo
dimulai sebelumwhich
telah keluar; shell yang menghasilkan baris perintah untukecho
tidak memiliki cara yang mungkin untuk mengetahui apa status keluarwhich
nantinya.