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"