ファイルから変数をエクスポートする方法は?


80

tmp.txtたとえば、エクスポートする変数を含むファイルがあります。

a=123
b="hello world"
c="one more variable"

exportコマンドを使用してこれらすべての変数をエクスポートして、後で子プロセスで使用できるようにするにはどうすればよいですか?


1
bash --init-file somefile.blah -c "コマンド"
ディリアンマーフィー

SOには、ディレクトリに移動したときにファイル自動的にソース.envする方法に関する有用な回答がありますcd
ダンダスカレスク

@Neerav他の回答を受け入れてください。それははるかに優れたソリューションです。
coderDude

回答:


65
source tmp.txt
export a b c
./child ...

他の質問から判断すると、変数名をハードコードしたくありません:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

試して:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
たとえば、環境ファイルにコメントが含まれている場合、これは機能しません。(例:systemdのEnvironmentFileで再利用できるファイル)
Chris Lamb

3
@ChrisLambを使用grepしてコメントをスキップできますexport $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
。– gvee

182
set -a
. ./tmp.txt
set +a

set -aこれにより、今後定義される変数¹が自動的にエクスポートされます。Bourneのようなシェルで使用できます。.以下のための標準とボーン名ですsourceので、私は(移植性のためにそれを好むコマンドsourceから来ているcshとを含む、ほとんどの近代的なボーンのようなシェルで利用できるようになりましたbash)時には、わずかに異なる動作をする(が)。

POSIXシェルではset -o allexport、より記述的な代替方法としてそれを記述(set +o allexport設定解除)することもできます。


¹ではbash、オンになっている間に宣言されたすべての関数allexport環境にエクスポートされることに注意してください(BASH_FUNC_myfunction%%環境変数は、としてbash実行されている場合でも、その環境で実行されるすべてのシェルによってインポートされますsh)。


1

ただやる:

while read LINE; do export "$LINE"; done < ./tmp.txt

それが機能するかどうか確認しましたか?
RalfFriedl

@RalfFriedlこれはうまくいくはずです、なぜですか?それは非常にエレガントではなく、ソースset -aははるかに簡単ですが、これは実際に機能します。
テルドン

これはもろいです。入力ファイルでコメントを許可せず、引用符で囲まれた変数値を適切に処理せず、複数行の変数で失敗します。確かに、複数行の変数はあまりありませんが、コメントは定期的に使用し、変数値には引用符を使用する必要があります。
ルイ

それは私のために働いた。
mchawre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.