![导出环境变量的脚本无法导出它们](https://linux22.com/image/120043/%E5%AF%BC%E5%87%BA%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E7%9A%84%E8%84%9A%E6%9C%AC%E6%97%A0%E6%B3%95%E5%AF%BC%E5%87%BA%E5%AE%83%E4%BB%AC.png)
我有以下名为的脚本export.sh
:
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SOURCE=$(dirname ${SOURCE})
export $(cat "${SOURCE}/../params.env" | xargs)
换句话说,它的作用是从一个名为的文件中导出环境变量,params.env
该文件按照惯例位于 prarent 文件夹中,并将内容导出为环境变量。
文件的示例内容params.env
为:
SOMEVAR="val1"
SOMEVAR2="val2"
成功的运行将为我提供SOMEVAR
价值val1
和SOMEVAR2
有价值的val2
环境变量。
但如果我跑:
./export.sh
然后之后
printenv | grep SOMEVAR
它并不表明环境变量已设置。
答案1
整个想法是对的,但你最终执行shell脚本而不是采购它使当前 shell 中的环境发生变化。
永远记住,执行脚本会运行一个子 shell,并且所有导出的系统环境变量都是丢失的子 shell 终止后。
看看在设置了调试模式的情况下运行脚本时会发生什么-x
(仅供参考,我正在params.env
从当前文件夹使用)
$ bash -x script.sh
+ SOURCE=script.sh
+ '[' -h script.sh ']'
++ dirname script.sh
+ SOURCE=.
++ cat ./params.env
++ xargs
+ export SOMEVAR=val1 SOMEVAR2=val2
+ SOMEVAR=val1
+ SOMEVAR2=val2
您可以看到变量已设置,但子 shell 破坏了导出的变量。现在在寻找脚本时,
source script.sh
printenv | grep SOMEVAR
SOMEVAR=val1
SOMEVAR2=val2
如果您的bash
版本不支持显式source
命令,请使用POSIX
兼容的方法. ./script.sh