如何从标准输入读取“读取”?

Tim*_*Tim 3 bash read

read 据说bash 内置命令接受来自 stdin 的输入,但为什么以下没有读取任何内容?

$ printf "%s" "a   b" | read line
$ printf "%s" "$line"
$
Run Code Online (Sandbox Code Playgroud)

谢谢。

fil*_*den 6

问题不在于read它本身,而在于管道。在 bash 中,这会导致第二个命令(read在本例中为 )在子shell 中运行。所以它实际上会read变成一个line变量,只有这个变量存在于子shell中,并且一旦管道完成就会消失。

(请注意,其他 shell 的行为有所不同,最显着的是 ksh 将在当前 shell 中运行管道的最后一个命令,因此此代码段可能在 ksh 中有效。在 bash 中它不起作用,正如您所看到的。)

一个可能的解决方案是对<(...)管道的第一部分使用进程替换,并附加<将其重定向到标准输入:

read line < <(printf "%s" "a   b")
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,您可以不使用该printf命令,然后<<<也可以:

read line <<<"a   b"
Run Code Online (Sandbox Code Playgroud)