Как не прерывать канал, когда я перенаправляю вывод эха на вход моей программы и моя программа завершает работу?
У меня есть это script.sh
:
while [ 1 ]
echo $(($RANDOM % 21))
done
У меня есть исполняемый файл ./a.out
содержит скомпилированный код C, который является игрой и принимает цифры от 1 до 20 на своем входе:
Я тестирую свою игру так:
./script.sh | ./a.out
Игра работает нормально, пока не закончится и не перестанет принимать аргументы stdin, и:
echo: write error: Broken pipe
Как не сломать трубу в этом случае? Как получить информацию, которую я должен прекратить выводить на экран?
1 ответ
Убедитесь, что стандартный вывод доступен для записи. Если запись не удалась, выйдите из цикла.
while true; do
echo $((RANDOM % 21)) || exit
done
(Кстати, while [ 1 ]
вероятно, не делает то, что ты думаешь. [
ака test
выдает истинное значение, если его аргумент не является пустой строкой. Это работает, конечно, но это не особенно элегантный или идиоматический способ написания while true
.)
Я не могу воспроизвести вашу проблему, но другой распространенный способ - отключить ловушку.
trap - SIGPIPE
(Может также заметить, что RANDOM
не нуждается в явном знаке доллара в арифметическом контексте.)