为什么我必须在使用管道时将读取的命令放入子shell

Yve*_*ves 5 bash pipe subshell read

该命令df .可以向我们显示我们在哪个设备上。例如,

me@ubuntu1804:~$ df .
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sdb1       61664044 8510340  49991644  15% /home
Run Code Online (Sandbox Code Playgroud)

现在我想得到字符串/dev/sdb1

我这样试过,但没有用:df . | read a; read a b; echo "$a",这个命令给了我一个空的输出。但df . | (read a; read a b; echo "$a")会按预期工作。

我现在有点困惑。

我知道这(read a; read a b; echo "$a")是一个子shell,但我不知道为什么我必须在这里制作一个子shell。据我了解,x|y会将 的输出重定向xy. 为什么read a; read a b; echo $a不能获得输入但子外壳可以?

mur*_*uru 8

这里的主要问题是正确地对命令进行分组。子外壳是次要问题。

x|y将重定向输出x到输入y

是的,但x | y; z不会将 的输出重定向xyz

在 中df . | read a; read a b; echo "$a",管道仅连接df .read a,其他命令与该管道没有连接。您必须将reads 组合在一起:df . | { read a; read a b; }或者df . | (read a; read a b)将管道连接到它们。

但是,现在出现了子shell 问题:管道中的命令在子shell 中运行,因此在其中设置变量不会影响父shell。所以echo命令必须与reads在同一个子 shell 中。所以:df . | { read a; read a b; echo "$a"; }

现在是使用( ... )还是{ ...; }在这里没有特别的区别,因为管道中的命令无论如何都是在子shell中运行的。


归档时间:

查看次数:

467 次

最近记录:

4 年,11 月 前