小编Cro*_*max的帖子

为什么 bash "read -t 0" 看不到输入?

我的脚本(应该)表现不同,这取决于输入流中数据的存在。所以我可以这样调用它:

$ my-script.sh
Run Code Online (Sandbox Code Playgroud)

或者:

$ my-script.sh <<-MARK
    Data comes...
    ...data goes.
MARK
Run Code Online (Sandbox Code Playgroud)

或者:

$ some-command | my-script.sh
Run Code Online (Sandbox Code Playgroud)

其中最后两个案例应该读取数据,而第一个案例应该注意到数据丢失并采取相应措施。

脚本的关键部分(摘录)是:

$ my-script.sh
Run Code Online (Sandbox Code Playgroud)

我使用read读取输入数据,然后选择-d ''读取多行,正如预期的那样,并将-t 0超时设置为零。为什么超时?根据help read(打字保持不变;粗体是我的):

-t timeout如果未在几TIMEOUT秒钟内读取完整的输入行,则超时并返回失败。TMOUT 变量的值是默认超时。 TIMEOUT可能是小数。 如果TIMEOUT为 0,则仅当指定文件描述符上的输入可用时 read 才返回成功。如果超时,则退出状态大于 128

所以我在情况 2 和 3 中应该立即读取数据,据我所知。不幸的是它没有。由于-t可以采用小数值(根据上面的手册页),将读取行更改为:

$ my-script.sh <<-MARK
    Data comes...
    ...data goes.
MARK
Run Code Online (Sandbox Code Playgroud)

当数据存在时实际读取数据,如果不存在则跳过它(在 10ms 超时后)。但它也应该在TIMEOUT设置为 real时工作0

为什么它实际上没有?如何解决这个问题?对于“根据数据的存在而采取不同行动”的问题,是否有替代解决方案?

更新

感谢@Isaac,我发现引用的在线版本和我的本地版本之间存在误导性差异(通常我没有将语言环境设置为 en_US,所以help read …

bash read

5
推荐指数
1
解决办法
2029
查看次数

标签 统计

bash ×1

read ×1