背景
这[ article ]说:
的命令替换扩展到命令的输出。这些 命令在子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一个新的外壳命令替换过程中产生了。此时我更改了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环境变量的修改,这有助于壳找到二进制文件。然而,当我和命令替换一起阅读时,我感到困惑。
如果$(..)
子外壳被衍生,然后环境变量PATH应完好无损并应指向二进制(cut
在这种情况下)等的bash不应抱怨它不能找到cut
二进制。
问题
怎么了PATH
的修改在这里影响命令替换?
我认为你对子外壳中'PATH' *的变化与*子外壳继承的'PATH' *的变化相混淆。 – chepner
@chepner:其实我忽略了PATH是一个环境变量的事实,并且它不需要导出以使更改生效。 – sjsam
啊,好的。请记住,“导出”变量实际上意味着标记其名称,以便与该名称关联的*值*被添加到任何子进程的环境中。环境变量是一个从环境初始化的变量,会自动导出。 – chepner