如果您调查该管道的退出状态,您会发现read
返回 1:
$ echo -n "Hello" | read
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
它返回 1,因为它遇到了文件结束条件,因此无法读取更多数据。输入流echo
已关闭,因为echo
已完成其任务并终止,从而关闭管道的那一侧。
在输入流关闭之前读取的数据echo
在变量中仍然可用REPLY
:
$ echo -n "Hello" | { read; echo "$REPLY"; }
Hello
Run Code Online (Sandbox Code Playgroud)
简而言之,read
不会等待进一步的输入,因为它注意到输入流已关闭。
另外(切线)相关:“保持管道打开”是什么意思?
你可能会遇到这样的循环:
while read variable || [ -n "$variable" ]; do
# something with "$variable"
done
Run Code Online (Sandbox Code Playgroud)
这允许读取可能无法由最终换行符正确终止的输入。如果没有-n
测试,并且数据中没有最终换行符,则最后一行(非终止行)将被跳过。
此循环中使用的实用程序read
就像一个测试。如果循环连接到的输入流关闭(read
读取超过文件末尾),read
将返回非零退出状态,并且循环将终止。通过-n
测试,它会执行一次额外的迭代,但是该额外的迭代只会确认,是的,没有更多数据可供读取,现在该值$variable
也为空。