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

How to not broken pipe when I redirect echo output on my program input and my program finishes?

我有这个 script.sh :

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

我有我的可执行文件 ./a.out,其中包含已编译的 C 代码,这是一个游戏,在他的输入中输入 1 到 20 之间的数字:

我就是这样测试我的游戏的:

./script.sh | ./a.out

游戏运行良好,直到完成并停止接受标准输入参数,并且:

echo: write error: Broken pipe

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

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

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

(顺便说一句,while [ 1 ] 可能不会按照您的想法行事。如果其参数不是空字符串,[ 又名 test 会产生一个真值。它 当然可以,,但这并不是一种特别优雅或惯用的写法 while true。)

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

trap - SIGPIPE

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