命名管道“堵塞”

命名管道“堵塞”
for elem in {1..99} ; do echo $elem> mypipe ; done

这段 bash 代码应该通过管道传递 99 个整数,之前在另一个终端上有这样的设置:

cat <mypipe

有人知道为什么我有时只能通过管道传递随机 (少于 99) 个整数,之后它就会挂起吗?我必须用Ctrl+终止脚本c,然后收到以下消息:

bash: mypipe: Interrupted system call

我正在运行 Ubuntu 11.10。

答案1

您的代码存在一个问题,即> mypipe会打开 fifo,写入数据,然后关闭它。一旦在任一端关闭它,您都必须在两个都结束。因此,不要每次回显时都重新打开 fifo,而是在整个循环中保持打开状态。

for elem in {1..99}; do echo "$elem"; done > mypipe

顺便说一句,代替那个 for 循环,您只需使用一个 printf 即可。

printf '%s\n' {1..99} > mypipe

如果你的情况更复杂,你可以为其分配一个 fd。

exec 3> mypipe # opens mypipe for writing on fd 3

echo "stuff" >&3
echo "more stuff" >&3
...

exec 3>&-      # closes fd 3

http://mywiki.wooledge.org/BashFAQ/085了解更多信息。

相关内容