导出环境变量的脚本无法导出它们

导出环境变量的脚本无法导出它们

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

相关内容