![](/img/trans.png)
[英]How can I reference non-exported Linux kernel functions from a kernel module?
[英]If bash pipeline commands run in subshell, why echo command can access the non-exported variables?
Bash 手册说“管道中的每个命令都作为单独的进程(即,在子外壳中)执行”。 我测试了两个简单的命令。
cd /home/work
str=hello
echo $str | tee a.log
它输出:
hello
似乎 echo 命令没有在子 shell 中执行,因为它可以访问未导出的变量$str
。
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.