在花括号和管道中分组命令不会保留变量

fed*_*qui 6 bash

假设myfile我当前的工作目录中有一个文件.如果命令正常执行,我想设置变量,但也使用其结果.

$ ls myfile && v=3
myfile
$ echo "$v"
3
Run Code Online (Sandbox Code Playgroud)

但是现在我也想管道结果,所以我使用{ list; }语法对命令进行分组:

$ unset v
$ { ls myfile && v=3; } | grep myf
myfile
$ echo "$v"
                  # v is not set

Bash参考手册 - > 3.2.4.3分组命令说:

{ list; }
Run Code Online (Sandbox Code Playgroud)

在大括号之间放置命令列表会导致列表在当前shell上下文中执行.没有创建子shell.以下列表中的分号(或换行符)是必需的.

所以,根据我的理解,v应该设置为3.但它没有发生.为什么?

Tom*_*ech 7

这不是导致子壳创建的花括号,而是管道.

为了证明这一点:

$ { ls && v=3; } > tmp
$ echo "$v"
3
Run Code Online (Sandbox Code Playgroud)

引用格雷格:

在大多数shell中,管道的每个命令都在单独的SubShell中执行.

  • 是的,因为`v = 2; v = 1 | echo"hi,v = $ v"`return"hi,v = 2".有意思,非常感谢! (2认同)