Когда завершается конвейерная программа и кто контролирует этот процесс завершения? Я прочитал Bash: почему канал прерывается?, но он охватывает это вопрос только частично. Попытавшись самостоятельно ответить на этот вопрос, я сделал пару примеров, чтобы увидеть их результаты. А вот этого я не понимаю: (a.sh
):
#!/bin/bash
echoerr() { echo $@ 1>&2; }
echoerr a.sh started
sleep 1
echo 1
sleep 1
echo 2
sleep 1
echo 3
sleep 1 # Line 1
echo 4 # Line 2
echoerr a.sh finished
И я запускаю его как ./a.sh | head -3
. Результат:
a.sh started
1
2
3
Из вывода я понял, что ./a.sh
был завершен сигналом SIGPIPE
после чтения первых 3 строк ввода, потому что больше данных не требовалось. Но когда я удаляю либо строку 1 либо строку 2, вывод меняется на следующее:
a.sh started
1
2
3
a.sh finished
Итак, мой вопрос:
- Какова политика завершения конвейерной программы?
- Почему строка 1 влияет на поведение программы?
- Почему строка 2 влияет на поведение программы?