名前が次のスクリプトがあります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
デフォルトフォルダにあるというファイルから環境変数をエクスポートし、その内容を環境変数としてエクスポートするということです。
ファイルの内容の例は次のとおりparams.env
です。
SOMEVAR="val1"
SOMEVAR2="val2"
成功した実行は私にSOMEVAR
価値val1
とSOMEVAR2
貴重なval2
環境変数を提供します。
しかし、私が実行した場合:
./export.sh
それから
printenv | grep SOMEVAR
環境変数が設定されたことを示しません。
答え1
すべての考えは正しかったが、結局あなたは実装する代わりにシェルスクリプト購入現在のシェルの環境が変更されます。
スクリプトを実行すると、サブシェルが実行され、エクスポートされたすべてのシステム環境変数が失われたサブシェルが終了した後。
デバッグモードに設定されたスクリプトを実行すると、何が起こるかを確認してください-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
変数が設定されていることがわかりますが、サブシェルはエクスポートした変数を削除します。今スクリプトを見つけるとき、
source script.sh
printenv | grep SOMEVAR
SOMEVAR=val1
SOMEVAR2=val2
bash
バージョンが明示的なコマンドをサポートしていない場合は、互換性のある方法をsource
使用してください。POSIX
. ./script.sh