尽管不使用换行符,但在管道传输期间如何终止输入?

尽管不使用换行符,但在管道传输期间如何终止输入?

当我发出这个命令时:

$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也是空的。

相关内容