BASH脚本设置环境变量不起作用
我已经编写了以下脚本来在需要时设置一些环境变量。
#!/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
将变量赋值export
到运行export
命令的shell的子进程。 您的命令行环境是脚本shell的父级 ,因此它不会看到变量赋值。
你可以使用.
(或source
)bash命令在当前shell环境中执行脚本命令并实现您想要的function,例如
source ./script.sh echo "$BASE"
会生产
/home/develop/trees
source
命令(通常在脚本中看到)是bash的同义词.
,这是POSIX标准的一部分(例如,在破折号中可用,但source
不是)。
. ./script.sh # identical to "source ./script.sh"
( . script.sh
和source script.sh
将首先在PATH
查找script.sh
,因此指定script.sh
的路径更安全。)
运行脚本时,它在子shell中运行。 变量仅在该子shell的上下文中有效。 将它们设置在.bashrc
或.profile
并读取变量和子shell 。 export
语句按照你的例子中的方式(当前shell及其所有子shell)进行操作。
或者(如果您真的希望脚本能够影响当前shell的环境),请将其运行为:
. ./script.sh
这导致它在您当前的shell中运行,但也不会在层次结构中传递变量。
我经常想要设置一个没有麻烦的环境变量。
以下是我添加到.bashrc中以实现此便利性的内容。
defect() { if [ $1 ] && [ -z $2 ] then eval 'export DEFECT=$1' return 0 else echo 'Usage: defect {number}' return 1 fi }
你可以尝试这样的事情
CURRENT_DIR=`pwd` echo "SOME_PATH is pointing to ${CURRENT_DIR}" #Export SOME_PATH for current working directory export SOME_PATH=${CURRENT_DIR}