Когда программа трубопровода завершена и кто контролирует этот процесс завершения? Я прочитал Bash: why the pipe is terminated?, но он охватывает этот вопрос только частично. Попробовав ответить на этот вопрос, я сделал несколько примеров, чтобы увидеть их результаты. И это один я не понимаю: (a.sh
):Какова политика завершающей программы в bash?
#!/bin/bash
echoerr() { echo [email protected] 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 строк ввода, так как не требовалось больше данных. Но когда я удалить либо Line 1 либо Line 2 Выходного сигнал изменяется на следующее:
a.sh started
1
2
3
a.sh finished
Так что мой вопрос, являются:
- Какова политика прекращения водопроводных программ?
- Почему строка 1 влияет на поведение программы?
- Почему строка 2 влияет на поведение программы?