read
据说bash 内置命令接受来自 stdin 的输入,但为什么以下没有读取任何内容?
$ printf "%s" "a b" | read line
$ printf "%s" "$line"
$
Run Code Online (Sandbox Code Playgroud)
谢谢。
问题不在于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)