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