为什么$BASH_SUBSHELL不';管内压力增加
我知道管道将创建子shell 我测试为什么$BASH_SUBSHELL不';管内压力增加,bash,pipe,subshell,Bash,Pipe,Subshell,我知道管道将创建子shell 我测试$BASH_SUBSHELL和$BASHPID,发现$BASH_SUBSHELL在管道中没有增加 echo $BASH_SUBSHELL # 0 echo $BASHPID # 8347 echo $BASH_SUBSHELL | cat # 0 echo $BASHPID | cat # 9727 (echo $BASH_SUBSHELL) # 1 (echo $BASHPID)
$BASH_SUBSHELL
和$BASHPID
,发现$BASH_SUBSHELL
在管道中没有增加
echo $BASH_SUBSHELL # 0
echo $BASHPID # 8347
echo $BASH_SUBSHELL | cat # 0
echo $BASHPID | cat # 9727
(echo $BASH_SUBSHELL) # 1
(echo $BASHPID) # 9778
当bash只是分叉、设置命令并执行它时,它不会将其视为子shell 对于任何类型的控制结构,如命令组、if语句和while循环,shell实际上必须在设置之外参与,它确实需要
这从bash源代码
execute\u command\u internal
的execute\u cmd.c
中可以明显看出 那么eval'echo$BASH_SUBSHELL'| cat
或{echo$BASH_SUBSHELL}cat
呢?@choroba它是有效的,但为什么$BASH_SUBSHELL在我的示例中没有增加我不确定。在运行子shell之前,该变量可能由父shell展开,但我找不到确切的文档,也不打算搜索源代码:-)即使是命令组{echo$BASH_subshell;}| cat
也足以增加该值,因此,看起来bash
解析器需要在命令本身中明确提示将生成子shell。