读取命令的管道不起作用

读取命令的管道不起作用

file1如果我重定向为标准输入,则 sh 中的读取命令有效

$ cat file1
first second
$ read u v <file1
$ echo $u
first
$ echo $v
second

但是,如果我从 echo 重定向标准输出,例如

$ echo first second | read a b
$ echo $a

这是行不通的。我认为在第二种情况下 read 从管道获取标准输入。为什么我错了?谢谢。

答案1

在你的第一个例子中:

read和“echo”是 shell 内置命令,它们将由您在其中键入命令的交互式 shell(同一进程)执行,因此这些命令的结果与您运行的 shell 的环境有关。

因此,当从指令返回时read,您仍然在同一个 shell 中,完全了解 u 和 v 变量值。

在你的第二个例子中:

即使该命令是内置的,管道也会强制您的交互式 shell 分叉子进程。在这种情况下,它将触发一个子 shell,该子 shell 将执行读取命令并更新其自己的环境(为 u 和 v 变量分配值),而不影响其父级的环境。

因此,当读取完成时,子 shell 终止,您将返回到交互式 shell,它完全不知道其子 shell 设置的 u 和 v 变量值。

相关内容