Saat truekeluar, sisi baca pipa ditutup, tetapi yesterus mencoba menulis ke sisi tulis. Kondisi ini disebut "pipa rusak", dan menyebabkan kernel mengirim SIGPIPEsinyal yes. Karena yestidak melakukan sesuatu yang istimewa pada sinyal ini, itu akan dibunuh. Jika mengabaikan sinyal, writepanggilannya akan gagal dengan kode kesalahan EPIPE. Program yang melakukan itu harus dipersiapkan untuk memperhatikan EPIPEdan berhenti menulis, atau mereka akan masuk ke loop yang tak terbatas.
Jika Anda melakukan strace yes | true1, Anda dapat melihat kernel mempersiapkan kedua kemungkinan:
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=17556, si_uid=1000} ---
+++ killed by SIGPIPE +++
stracesedang menonton acara melalui API debugger, yang pertama kali memberitahukannya tentang panggilan sistem yang kembali dengan kesalahan, dan kemudian tentang sinyal. Namun dari yesperspektif, sinyal terjadi terlebih dahulu. (Secara teknis, sinyal dikirim setelah kernel mengembalikan kontrol ke ruang pengguna, tetapi sebelum instruksi mesin dijalankan lagi, sehingga fungsi write"pembungkus" di perpustakaan C tidak mendapatkan kesempatan untuk mengatur errnodan kembali ke aplikasi.)
1 Sedihnya, stracekhusus untuk Linux. Sebagian besar Unix modern memiliki beberapa perintah yang melakukan hal serupa, tetapi sering memiliki nama yang berbeda, mungkin tidak memecahkan kode syscall argumen secara menyeluruh, dan kadang-kadang hanya berfungsi untuk root.
yes | tee >(true) >/dev/nullakan melakukan apa yang Anda harapkan, btw, seperti yangteeberlanjut sampai semua penulis mati, sehinggatruekeluar tidak akan mengganggu sepenuhnya.