Skrip shell dapat kehilangan deskriptor file standar dan file lainnya jika ujung lainnya hilang. Salah satu cara ini bisa terjadi adalah dengan menghentikan ssh klien digunakan untuk meluncurkan skrip:
$ ssh localhost test
^C
Ini meluncurkan bash skrip yang disebut test melalui SSH dan Ctrl C digunakan untuk mengakhiri ssh memerintah. Ini tidak menghentikan test yang terus berjalan tetapi tidak menutup deskriptor file terlampir (mis. input/output/error standar).
Jika test mencoba menggunakan deskriptor file tertutup itu maka itu akan berakhir dengan SIGPIPE . echo sederhana sudah cukup.
Salah satu hal test mungkin memiliki log fungsi yang menggunakan echo untuk menulis pesan ke jurnal systemd dan juga ke kesalahan standar. Sesuatu seperti ini:
log() {
echo "$*" | systemd-cat -t test
echo >&2 "$*"
}
echo kedua memunculkan SIGPIPE setelah ssh sesi dimatikan (Ctrl C ). Ini dapat dilindungi, sehingga eksekusi berlanjut tanpa echo yang menyinggung , dengan meletakkan echo dalam subkulit:
( echo >&2 "$*" )
Tapi apakah ada cara yang lebih baik?
Jawaban yang Diterima:
Anda bisa jika Anda ingin mengabaikan SIGPIPE dalam skrip:
trap "" PIPE