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会将 的输出重定向x到y. 为什么read a; read a b; echo $a不能获得输入但子外壳可以?
这里的主要问题是正确地对命令进行分组。子外壳是次要问题。
x|y将重定向输出x到输入y
是的,但x | y; z不会将 的输出重定向x到y和z。
在 中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 次 |
| 最近记录: |