命令替换和 $PATH 变量
Command substitution and $PATH variable
背景
这个[ article ]说:
The command substitution expands to the output of commands. These
commands are executed in a subshell ..
但是 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 找到二进制文件。但是,当我将其与命令替换一起阅读时,我感到很困惑。
如果通过 $(..)
生成了一个子 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 继承与父 shell 相同的环境,即使未导出变量。 (即使 $$
与父 shell 相同。)
背景
这个[ article ]说:
The command substitution expands to the output of commands. These commands are executed in a subshell ..
但是 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 找到二进制文件。但是,当我将其与命令替换一起阅读时,我感到很困惑。
如果通过 $(..)
生成了一个子 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 继承与父 shell 相同的环境,即使未导出变量。 (即使 $$
与父 shell 相同。)