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