Linux 环境变量不可用于shell脚本中的下一个命令

Linux 环境变量不可用于shell脚本中的下一个命令,linux,bash,shell,unix,environment-variables,Linux,Bash,Shell,Unix,Environment Variables,我们有一个名为source.sh的shell脚本,它导出构建所需的许多环境变量 我试图通过在脚本中运行source.sh来访问这些环境变量,但即使在运行之后,我也无法访问后续命令的环境变量 我的剧本看起来很像: #!/bin/bash sh source.sh cd $ROOT_VOS make 但是这里没有发生cd$ROOT\u声音sh source.sh …在sh的一个单独副本中运行source.sh(实际上,由于父shell是bash,子shell是sh,它不仅仅是一个“单独副本”,它

我们有一个名为source.sh的shell脚本,它导出构建所需的许多环境变量

我试图通过在脚本中运行source.sh来访问这些环境变量,但即使在运行之后,我也无法访问后续命令的环境变量

我的剧本看起来很像:

#!/bin/bash

sh source.sh
cd $ROOT_VOS
make

但是这里没有发生cd$ROOT\u声音

sh source.sh

…在
sh
的一个单独副本中运行
source.sh
(实际上,由于父shell是
bash
,子shell是
sh
,它不仅仅是一个“单独副本”,它是一个完全不同的解释器)。当那个单独的解释器退出时,局部变量和对进程局部状态的其他更改就消失了。(环境变量由子进程继承;它们不会向上传播到父进程)


相反,请使用:

# POSIX-compliant: execute every command in source.sh in the current shell
. source.sh
……或者

# bash-specific, perhaps more-readable, synonym for the same
source source.sh

顺便说一句,与常规shell变量相比,没有充分的理由将其作为环境变量——POSIX约定指定了所有大写变量名的名称空间,用于对操作系统和shell有意义的变量,小写名称保留给应用程序使用。(正式地说,这是为环境变量指定的,但是设置常规shell变量会覆盖任何类似的命名环境变量,因此该约定必然适用于这两个地方)。