Bash 使用管道可防止左进程导出变量。为什么?
我有以下一行bash文件Bash 使用管道可防止左进程导出变量。为什么?,bash,environment-variables,pipe,Bash,Environment Variables,Pipe,我有以下一行bash文件foo.sh: export PATH=<new path> 根据执行第二个脚本的机器,主脚本中的路径是否更新。在它不工作的机器上,无论管道的命令权限如何,它仍然不工作。相反,如果我把管子掉在地上,不管机器是什么,它都能工作 我的机器应该具有完全相同的配置(尽管考虑到这个问题,看起来它们没有)。Bash版本是4.1.2 你知道在哪里/看什么来理解这种行为吗?在bash中,管道的所有部分都在单独的子shell中执行,这就是为什么源代码脚本不会更改路径 某些sh
foo.sh
:
export PATH=<new path>
根据执行第二个脚本的机器,主脚本中的路径是否更新。在它不工作的机器上,无论管道的命令权限如何,它仍然不工作。相反,如果我把管子掉在地上,不管机器是什么,它都能工作
我的机器应该具有完全相同的配置(尽管考虑到这个问题,看起来它们没有)。Bash版本是4.1.2
你知道在哪里/看什么来理解这种行为吗?在
bash
中,管道的所有部分都在单独的子shell中执行,这就是为什么源代码脚本不会更改路径
某些shell能够在当前shell环境中运行最后一个命令(ksh93
),但bash
不能(除非禁用作业控制并且启用了lastpipe
shell选项,并且不在后台执行管道)
bash
手动状态,在“管道”部分中
管道中的每个命令都作为单独的进程执行(即
子壳)
在
bash
中,管道的所有部分都在单独的子shell中执行,这就是为什么源代码脚本不会更改路径的原因
某些shell能够在当前shell环境中运行最后一个命令(ksh93
),但bash
不能(除非禁用作业控制并且启用了lastpipe
shell选项,并且不在后台执行管道)
bash
手动状态,在“管道”部分中
管道中的每个命令都作为单独的进程执行(即
子壳)
管道始终创建一个子壳。管道右侧的命令在单独的shellYes中执行,但导出是在管道左侧的命令中完成的:),因此这正是@Inian所提到的。您的
foo.sh
在您当前的shell中执行,即您正在与之交互的shell。另一方面,grep bar
在子shell中执行,您几乎可以想象有人打开一个新的bash终端并执行它。无论导出什么,都将仅在当前shell中可见。您可以使用简单的示例export bar='test'| echo“$bar”
来测试它。恐怕我还不够清楚。当我说路径没有更新时,我的意思是在调用方脚本中,而不是在grep
或管道右侧的任何其他进程中!在bash中,管道的两侧都在子进程中执行。管道总是创建一个子shell。管道右侧的命令在单独的shellYes中执行,但导出是在管道左侧的命令中完成的:),因此这正是@Inian所提到的。您的foo.sh
在您当前的shell中执行,即您正在与之交互的shell。另一方面,grep bar
在子shell中执行,您几乎可以想象有人打开一个新的bash终端并执行它。无论导出什么,都将仅在当前shell中可见。您可以使用简单的示例export bar='test'| echo“$bar”
来测试它。恐怕我还不够清楚。当我说路径没有更新时,我的意思是在调用方脚本中,而不是在grep
或管道右侧的任何其他进程中!在bash中,管道的两侧都在子进程中执行。
echo $PATH # --> old path
. foo.sh | grep bar
echo $PATH # --> old path!!!!