Команды связаны с конвейером (здесь я говорю о системном примитиве - очевидно, они связаны с |
). Когда конец канала для чтения ( stdin
из head
) становится close
d (== когда head
либо явно ( ] close
) или неявно (exit) закрывает его), попытки записи в конец записи ( stdout
of yes
) завершатся ошибкой.
По умолчанию это не просто обычная ошибка errno
, а сбой, в результате которого процесс записи получает сигнал SIGPIPE
.По умолчанию обработчик сигнала SIGPIPE завершает работу.
Короче говоря, если вы напишете на сломанный канал, система отправит вам SIGPIPE
и по умолчанию SIGPIPE
убьет вас. Вот почему да
завершается, когда голова
заканчивается (и тем самым разрывает трубу).
Если вы проигнорируете SIGPIPE
в родительской оболочке, то команды унаследуют это расположение, и запись
в сломанный канал просто вызовет ошибку errno
. из EPIPE
. Как оказалось, да
преобразовывает эту ошибку в строку и печатает ее:
$ (trap "" SIGPIPE; yes | head -n 5)
y
y
y
y
yes: standard output: Broken pipe
yes: write error