![使用“read”从 fifo 读取时不会发生超时](https://linux22.com/image/24194/%E4%BD%BF%E7%94%A8%E2%80%9Cread%E2%80%9D%E4%BB%8E%20fifo%20%E8%AF%BB%E5%8F%96%E6%97%B6%E4%B8%8D%E4%BC%9A%E5%8F%91%E7%94%9F%E8%B6%85%E6%97%B6.png)
看这段代码:
while read -t 3 line; do
echo ${line}
done < /opt/data.log
data.log
是一个先进先出。一个进程正在写入它,并且该代码应该读取它以显示给用户。但我希望它在 3 秒内 fifo 中没有更多数据时退出。
问题是它永远不会超时。我写入这个 fifo,它向我显示:
read: 6: Illegal option -t
怎么了?
[更新]
是的,我使用的/bin/sh
是 shebang,它是 的符号链接dash
。我把它改为/bin/bash
.但它没有任何好处。如果没有人打开 fifo,它就会永远等待。我想要一个超时解决方案,当 fifo 的另一端未打开它时该解决方案有效。
答案1
你在使用 bash 吗?或者其他什么? read -t
是一个 kshism(bash 和 zsh 也支持,但不是标准的)
它在 bash 中有效,但在 dash 中无效:
$ bash -c 'echo foo | bash同时读取 -t 3 xxxx ;做回显 $xxxx ;完毕' 富
$ 破折号 -c 'echo foo |同时读取 -t 3 xxxx ;做回显 $xxxx ;完毕' 破折号:1:读取:非法选项-t
答案2
我确实找到了一个好方法来做到这一点:
exec 5<>/opt/data.log
while read -7 3 line <& 5; do
echo ${line}
done
我打开它进行读写,这样脚本就不会永远阻塞。这是描述: https://stackoverflow.com/a/4875924/654269