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

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

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

$ printf "%s" "a   b" | read line
$ printf "%s" "$line"
$

谢谢。

答案1

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

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

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

read line < <(printf "%s" "a   b")

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

read line <<<"a   b"

相关内容