Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用管道可防止左进程导出变量。为什么?_Bash_Environment Variables_Pipe - Fatal编程技术网

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

Bash 使用管道可防止左进程导出变量。为什么?,bash,environment-variables,pipe,Bash,Environment Variables,Pipe,我有以下一行bash文件foo.sh: export PATH=<new path> 根据执行第二个脚本的机器,主脚本中的路径是否更新。在它不工作的机器上,无论管道的命令权限如何,它仍然不工作。相反,如果我把管子掉在地上,不管机器是什么,它都能工作 我的机器应该具有完全相同的配置(尽管考虑到这个问题,看起来它们没有)。Bash版本是4.1.2 你知道在哪里/看什么来理解这种行为吗?在bash中,管道的所有部分都在单独的子shell中执行,这就是为什么源代码脚本不会更改路径 某些sh

我有以下一行bash文件
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!!!!