使用管道可防止左进程导出变量。为什么呢?

时间:2018-05-15 08:33:37

标签: bash environment-variables pipe

我有以下单行bash文件foo.sh

export PATH=<new path>

在另一个脚本中,我使用:

echo $PATH # --> old path
. foo.sh | grep bar
echo $PATH # --> old path!!!!

根据我执行第二个脚本的机器,PATH在主脚本中更新或未更新。在它不起作用的机器上,无论管道的命令权如何,它仍然不起作用。相反,如果我放下管道,无论机器如何,它都能正常工作。

我的机器应该具有完全相同的配置(即使考虑到这个问题,看起来好像他们没有)。 Bash版本是4.1.2。

你知道在哪里/看什么来理解这种行为吗?

1 个答案:

答案 0 :(得分:2)

bash中,管道的所有部分都在不同的子shell中执行,这就是为什么源脚本不会改变路径。

某些 shell能够在当前shell环境中运行 last 命令(例如ksh93),但bash不会(除非禁用作业控制并且启用了lastpipe shell选项,并且管道未在后台执行)。

bash手册中的&#34; Pipelines&#34;部,

  

管道中的每个命令都作为一个单独的进程执行(即,在          一个子壳)。