当我在我的程序输入上重定向 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
在算术上下文中不需要明确的美元符号。)
我有这个 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
在算术上下文中不需要明确的美元符号。)