Как не прерывать канал, когда я перенаправляю вывод эха на вход моей программы и моя программа завершает работу?

У меня есть это 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 не нуждается в явном знаке доллара в арифметическом контексте.)

Другие вопросы по тегам