web-dev-qa-db-ja.com

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

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

export.bash

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

スクリプトを実行して$VARにアクセスしようとすると、値が得られません。

echo $VAR

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

217
tarrsalah

ソースを使わずに$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

この最後のアプローチは(あなたが今までに作った他のすべての設定や履歴と共に)あなたの現在のShellの設定をあなたに与えないので対話的な使用には不便ですが非常に役に立ちます。

248
Keith Thompson

最初に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ファイルを読み込み、あなたはいつでも上記のように行うことができます...

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

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

単にエコーアウトしてから、エコーでエクスポートを実行してください。

猫export.bash

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

スクリプトまたはコンソールの実行中

 export "$(./export.bash)"

試してください:

echo $VAR
HELLO THERE

上記の方法を使用して別のスクリプトに何を期待しているのかを知っている限り、複数の値が使用できます。

猫export.bash

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

cat 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


.

そして自動割り当ての最後の最終更新はVARIABLESを読みます。

./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
42
Vahid

ファイルから環境変数をエクスポートするための面白くて綺麗な方法を見つけました:

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
12
Van

Execute

set -o allexport

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

source conf-file

完了したら実行します。これはallexportモードを無効にします。

set +o allexport
4
mdornfe1

場合によっては、エクスポートされた変数を継承する別のbashを作成するという方法もあります。それは@Keith Thompsonの答えの特定のケースです、これらの欠点のすべてになります。

export.bash:

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

今:

./export.bash
echo $VAR
3
Gonmator

答えは「いいえ」ですが、私にとっては次のようにしました。

スクリプト:myExport

#! \bin\bash
export $1

私の.bashrcのエイリアス

alias myExport='source myExport' 

それでもあなたはそれをソースします、しかしたぶんこのようにそれはより有用でありそしてそれは他の誰かにとって興味深いものです。

1
Malcomar

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

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

外部で変数を使用しているため、スクリプトファイルの書き込みを避けることができます。

1
zhi.yang