我有以下单行bash文件foo.sh
:
export PATH=<new path>
在另一个脚本中,我使用:
echo $PATH # --> old path
. foo.sh | grep bar
echo $PATH # --> old path!!!!
根据我执行第二个脚本的机器,PATH在主脚本中更新或未更新。在它不起作用的机器上,无论管道的命令权如何,它仍然不起作用。相反,如果我放下管道,无论机器如何,它都能正常工作。
我的机器应该具有完全相同的配置(即使考虑到这个问题,看起来好像他们没有)。 Bash版本是4.1.2。
你知道在哪里/看什么来理解这种行为吗?
答案 0 :(得分:2)
在bash
中,管道的所有部分都在不同的子shell中执行,这就是为什么源脚本不会改变路径。
某些 shell能够在当前shell环境中运行 last 命令(例如ksh93
),但bash
不会(除非禁用作业控制并且启用了lastpipe
shell选项,并且管道未在后台执行)。
bash
手册中的&#34; Pipelines&#34;部,
管道中的每个命令都作为一个单独的进程执行(即,在 一个子壳)。