我编写了以下脚本,以便在需要时设置一些环境变量:
#!/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
~$:
怎么了?
答案1
export
将变量赋值导出到export
运行该命令的 shell 的子进程。您的命令行环境是父母脚本的 shell,因此它看不到变量赋值。
您可以使用.
(或source
)bash命令在当前shell环境中执行脚本命令并实现您想要的功能,例如
source ./script.sh
echo "$BASE"
会产生
/home/develop/trees
该source
命令通常在脚本中看到,是 bash 的同义词.
,它是 POSIX 标准的一部分(因此.
例如在 dash 中可用,但source
不是)。
. ./script.sh # identical to "source ./script.sh"
(. script.sh
并且将首先在中source script.sh
寻找,因此指定到的路径更安全。)script.sh
PATH
script.sh
答案2
运行脚本时,它会在子 shell 中运行。变量仅在该子 shell 的上下文中有效。将它们设置在或中.bashrc
,.profile
然后阅读 变量和子 shell。该export
语句按层次结构(当前 shell 及其所有子 shell)向下运行,而不是像您的示例中那样向上运行。
或者(如果你确实希望脚本影响当前 shell 的环境)按如下方式运行它:
. ./script.sh
这会导致它在您当前的 shell 中运行,但也不会将变量传递到层次结构中。
答案3
我经常想轻松地设置环境变量。
这是我添加到 .bashrc 中以实现此便利的内容。
defect() {
if [ $1 ] && [ -z $2 ]
then
eval 'export DEFECT=$1'
return 0
else
echo 'Usage: defect {number}'
return 1
fi
}