问题描述
我已经编写了以下脚本,以便在需要时设置一些环境变量。
#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH
在命令和结果之下,我可以在终端上看到:脚本运行,但变量未设置在最后。
~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE
~$:
怎么了?提前致谢。米尔科
最佳解决思路
export
将变量赋值导出到sub-shells,即作为包含export
指令的shell的子进程启动的shell。您的命令行环境是脚本 shell 的父级,因此它看不到变量分配。
您可以使用source
bash命令在当前shell环境中执行脚本命令并实现您想要的操作,例如,
source script.sh
echo $BASE
会产生
/home/develop/trees
.
命令是source
的同义词,通常在脚本中可以看到。
. script.sh # identical to "source script.sh"
次佳解决思路
我经常想设置一个环境变量而不麻烦。
这是我添加到我的.bashrc实现这种便利。
defect() {
if [ $1 ] && [ -z $2 ]
then
eval 'export DEFECT=$1'
return 0
else
echo 'Usage: defect {number}'
return 1
fi
}
第三种解决思路
当你运行一个脚本时,它运行在一个子shell中。变量仅在该子 shell 的上下文中有效。将它们设置在.bashrc
或.profile
中,并在variables and subshells上进行读取。 export
语句在您的示例中不起作用(当前shell和所有子shell)。
或者(如果你真的想让脚本影响当前shell的环境),请将其作为:
. ./script.sh
这会导致它在当前shell中运行,但不会将变量传递到层次结构中。