我有以下名为的脚本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