使用“read”从 fifo 读取时不会发生超时

使用“read”从 fifo 读取时不会发生超时

看这段代码:

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

相关内容