背景
这篇文章说:
命令替换扩展为命令的输出。这些命令在子shell中执行。
但是bash手册subshell
在其命令替换部分中什么都没有说。
我的测试如下
$ ps
PID TTY TIME CMD
26483 pts/25 00:00:00 bash
26866 pts/25 00:00:00 ps
$ hpid="$(ps | grep bash)"
$ echo "$hpid"
26483 pts/25 00:00:00 bash
26899 pts/25 00:00:00 bash
显示了在命令替换期间生成了一个具有pid 26899的新shell。此时,我更改了PATH
环境变量。
$ PATH="/some/rogue/path"
做以下事情:
VAR="$(echo "Do|Die" | cut -d"|" -f 2)"
并得到以下错误:
Command 'cut' is available in '/usr/bin/cut'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
cut: command not found
我知道该错误是由于PATH环境变量的修改而引起的,该变量有助于外壳程序定位二进制文件。但是,在阅读本文和命令替换时,我感到很困惑。
如果通过$(..)
子shell生成,则PATH环境变量应完整无缺,并且应指向二进制文件(cut
在这种情况下),因此bash不应抱怨它无法找到cut
二进制文件。
问题
修改修改对PATH
这里的命令替换有何影响?
考虑以下示例:
$ export PS1='\$\$=$$ \$ '
$$=30862 $ a=123 # Note: No export a here.
$$=30862 $ echo $a
123
$$=30862 $ bash
$$=31133 $ echo $a # Subshell explicitly created does not have it.
$$=31133 $ exit
$$=30862 $ echo $(eval 'echo $a') # This subshell however does inherit it. The single quote ensures that this is not evaluated by parent shell.
123 # echo $(echo $a) would probably cause $a to be evaluated by parent shell.
$$=30862 $
简而言之,$(...)
即使未导出变量,由子程序生成的子外壳程序也将继承与父外壳程序相同的环境。(甚至$$
与父shell相同。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句