ソーシングせずにbashスクリプトから環境に変数をエクスポートできますか?


282

このスクリプトがあるとします

export.bash

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

スクリプトを実行してにアクセスしようとしても$VAR、値がありません。

echo $VAR

ソースなしでexport.bash$VAR実行するだけでにアクセスする方法はありますか?


1
スクリプトの代わりにエイリアスを使用して変数を定義することもできます。
jdigital 2013年

私が取り組んでいるスクリプトは、Java仮想マネージャーの一種です。計算を行った後、$ JAVA_HOMEをenvにエクスポートし、それをPATHに追加します。
tarrsalah 2013年

まあ、あなたは情報をファイルに書き込んでからそれを読み返すことができますが、調達ははるかに簡単に思えます。
jdigital 2013年

7
子プロセスは、親の環境を変更できません。親は自分自身を変更することを選択する必要があります(sourceor evalまたは...を使用)
glenn jackman 2013年

1
ソースの詳細を読むには、bashに組み込まれてman sourceいるため機能しません。source実行する必要がありますhelp source
peterchaula 2017

回答:


318

ソースなしで$VAR実行するだけでにアクセスする方法はありますexport.bashか?

簡単な答え:いいえ。

ただし、いくつかの回避策があります。

あなたがすでに述べた最も明白なものは、呼び出しシェルのコンテキストでスクリプトを使用sourceまたは.実行することです:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

別の方法は、環境変数を設定するのではなく、スクリプトに環境変数を設定するコマンドを出力させることです。

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

3番目のアプローチは、環境変数を内部的に設定し、その環境で指定されたコマンドを呼び出すスクリプトを用意することです。

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

この最後のアプローチは非常に便利ですが、現在のシェルの設定(他のすべての設定と作成した履歴を含む)を提供しないため、インタラクティブな使用には不便です。


57

VAR変数を最初にエクスポートするために、最も論理的で機能しているように見えるのは、変数をソースにすることです。

. ./export.bash

または

source ./export.bash

今度はメインシェルからエコーするとうまくいきます

 echo $VAR
HELLO, VARABLE

VARをリセットします

export VAR=""
echo $VAR

次に、スクリプトを実行して変数を取得し、設定を解除します。

./test-export.sh 
HELLO, VARABLE
--
.

コード:cat test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

ここに一つの方法があります

注意:エクスポートは、メインコンソールでエクスポートを実行するスクリプトに限定されます。cronジョブに関しては、以下のようにコンソールのように追加します...コマンドの部分はまだ疑わしいです。シェルから実行します。

コマンドプロンプト(export.bashに複数のエコー値がある場合)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

猫v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

これがあなたの使用法である限り、次のようにbashエイリアスを実行することで、いつでもスクリプトで変数を使用できるようにすることができます。

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

これを.bashrcに追加してください

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

あなたのbashrcファイルを調達し、あなたはいつでも上記のように行うことができます...

とにかく、残りの部分に戻ります。

これにより、グローバルに使用可能になり、スクリプトが実行されました。

単にそれをエコーし​​、エコーでエクスポートを実行します!

猫の輸出.bash

#!/bin/bash
echo "VAR=HELLO THERE"

スクリプトまたはコンソール実行内で:

 export "$(./export.bash)"

試してください:

echo $VAR
HELLO THERE

上記の方法を使用して別のスクリプトで期待していることがわかっている限り、複数の値:

猫の輸出.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

猫test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

今結果

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

そして自動割り当てのための最後の最終更新は変数を読みます:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

スクリプト:cat test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

VARをソースするのではなく、ファイルを実行してエクスポートしたい。
tarrsalah 2013年

@vahidは、スクリプトの実行内容を説明する必要があります。
FDinoff 2013年

1
ソーシング後に変数の設定を解除しませんか?自分で引き起こそうとする痛みがtest-exportスクリプトを更新するよりもずっと簡単です
VH

私はそれを行う別の方法を与えました-Tarrsalah
VH

ok最終更新-提案された方法の問題とbashrcエイリアスのアイデアを回避することは、おそらく素晴らしい方法でしょう
VH

22

実行する

set -o allexport

これ以降にファイルからソースする変数はすべてシェルにエクスポートされます。

source conf-file

完了したら、実行します。これにより、すべてのエクスポートモードが無効になります。

set +o allexport

7
問題の要点は、「ソースなしでエクスポートする方法」です。この回答はソースを使用しています。
Gonen I

@ekkisええ、それは質問に正確に答えるわけではありませんが、ファイルから変数をエクスポートする方法をグーグルで検索するときはいつでも、このスレッドが登場しました。だから私はそれを自分のためにそこに置いただけです。
mdornfe1

シンプルで使いやすい。これは答えとしてマークする必要があります。
QkiZ

1
元の問題の説明により、これが私の根本的な解決策であることが理解できるようになったので、これに賛成しました。allexportの公式ドキュメントは次のとおり
bash

ああ、+ 1。この質問は、bash source exportGoogle のキーワードのトップ結果です
ttimasdf

14

ファイルから環境変数をエクスポートする興味深い、きちんとした方法を見つけました:

env.vars

foo=test

テストスクリプト:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

7

状況に応じて、別の回避策が役立ちます。エクスポートされた変数を継承する別のbashを作成します。これは@Keith Thompsonの回答の特定のケースであり、これらの欠点はすべて解消されます。

export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

今:

./export.bash
echo $VAR

あなたが書いたものがうまくいくと確信していますか?私はあなたがラインコマンドを実行する必要があると信じている:. ./export.bash
サージョー・ブラック

@Sir Jo Black、はい、確かに。export.bashファイルの最後の行はbash、現在のシェルの子として呼び出されます。VAR以前にエクスポートされたため、その呼び出しには変数が含まれます。あなたが入力した場合もちろん、消灯します。確認しましたか?exitVAR
Gonmator 2018年

OK!私はその呼び出しを見たことはありません...:p
サージョーブラック

1

答えはノーですが、私のために私は次のことをしました

スクリプト:myExport

#! \bin\bash
export $1

私の.bashrcのエイリアス

alias myExport='source myExport' 

それでもあなたはそれを調達しますが、おそらくこのようにするとより使いやすくなり、他の人にとって興味深いものになります。


1

たぶん、あなたは〜/ .zshrc、〜/ .bashrcに関数を書くことができます。

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

外部で変数を使用するため、スクリプトファイルの書き込みを回避できます。

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