2013-07-28 5 views
1

Когда программа трубопровода завершена и кто контролирует этот процесс завершения? Я прочитал 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 влияет на поведение программы?

ответ

2

Как вы уже сказали, скрипт оболочки умрет, если он попытается написать замкнутый канал. Это не так, если это не так.

Если вы удалите вторую строку, a.sh не пытается записать ее stdout после echo 3, поэтому у нее нет причин для отказа.

Удаление первой строки может не дать вам тот же результат при каждом выполнении теста. Есть проблема с синхронизацией. Если последние два оператора echo обрабатываются до того, как head попытается прочитать из его ввода (и завершится, потому что достигнуто 3 строки), то a.sh не получит ошибку разбитого трубопровода. Если синхронизация такова, что head считывает между двумя echo s, тогда a.sh получит ошибку в трубе и умрет.

 Смежные вопросы

  • Нет связанных вопросов^_^