假设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
Run Code Online (Sandbox Code Playgroud){ list; }在大括号之间放置命令列表会导致列表在当前shell上下文中执行.没有创建子shell.以下列表中的分号(或换行符)是必需的.
所以,根据我的理解,v应该设置为3.但它没有发生.为什么?
这不是导致子壳创建的花括号,而是管道.
为了证明这一点:
$ { ls && v=3; } > tmp
$ echo "$v"
3
Run Code Online (Sandbox Code Playgroud)
引用格雷格:
在大多数shell中,管道的每个命令都在单独的SubShell中执行.
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |