Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么$BASH_SUBSHELL不';管内压力增加_Bash_Pipe_Subshell - Fatal编程技术网

为什么$BASH_SUBSHELL不';管内压力增加

为什么$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)

我知道管道将创建子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)             # 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。