繁体   English   中英

如果 bash 管道命令在 subshell 中运行,为什么 echo 命令可以访问未导出的变量?

[英]If bash pipeline commands run in subshell, why echo command can access the non-exported variables?

Bash 手册说“管道中的每个命令都作为单独的进程(即,在子外壳中)执行”。 我测试了两个简单的命令。

场景 1

cd /home/work
str=hello
echo $str | tee a.log

它输出:

hello

似乎 echo 命令没有在子 shell 中执行,因为它可以访问未导出的变量$str

场景 2

cd /home/work
cd src | pwd
pwd

它输出:

/home/work

看起来 cd 命令是在子 shell 中执行的,因为它不会影响原始 shello 的工作目录。

谁能解释为什么行为不一致?

谁能解释为什么行为不一致?

好吧,因为这就是它的设计方式。 “子shell”继承了整个上下文,而不仅仅是导出的变量。

Bash 手册说“管道中的每个命令都作为单独的进程执行(即在子外壳中)”

Bsah 手册可在此处获得 你提到的那句话字面上有一个解开谜团的链接:

管道中的每个命令都在其自己的子 shell 中执行,这是一个单独的进程(请参阅命令执行环境)。

然后您可以从中检查“命令执行环境”(强调我的):

shell有一个执行环境,包括以下内容:

  • ...
  • shell 通过变量赋值设置的参数...
  • ...

...

命令替换、用括号分组的命令和异步命令在与 shell 环境重复的子 shell 环境中调用,...

子shell 拥有所有环境(好吧,除了陷阱)。 另一方面命令:

当要执行除内置命令或 shell function 以外的简单命令时,将在包含以下内容的单独执行环境中调用它。 ……

  • ...
  • shell 标记为导出的变量和函数,...

如果 bash 管道命令在 subshell 中运行,为什么 echo 命令可以访问未导出的变量?

因为子shell继承了父环境,包括所有未导出的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM