当我在程序输入上重定向echo输出并且我的程序完成时,如何不破坏管道?

时间:2018-04-08 15:33:35

标签: bash shell echo

我有script.sh

while [ 1 ]
echo $(($RANDOM % 21))
done

我的可执行文件./a.out包含已编译的C代码,这是一款游戏,输入的数字介于1到20之间:

我像那样测试我的游戏:

./script.sh | ./a.out

游戏运行良好,直到完成并停止参加stdin参数,并且:

echo: write error: Broken pipe

在这种情况下如何不破管?如何获取我必须停止回应的信息?

1 个答案:

答案 0 :(得分:1)

检查标准输出是否可写。如果写入失败,请退出循环。

while true; do
    echo $((RANDOM % 21)) || exit
done

(顺便说一下,while [ 1 ]可能没有按照你的想法行事。[ aka test如果它的argurent不是一个空字符串,则产生一个真值。它有效, 当然,但写while true不是一种特别优雅或惯用的方式。)

我无法重现您的问题,但另一种常见的解决方法是禁用陷阱。

trap - SIGPIPE

(也许还要注意RANDOM在算术上下文中不需要显式的美元符号。)