我的脚本(应该)表现不同,这取决于输入流中数据的存在。所以我可以这样调用它:
$ 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 …