このスクリプトがあるとします。
export.bash :
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
スクリプトを実行して$VAR
にアクセスしようとすると、値が得られません。
echo $VAR
ソースなしで export.bash を実行するだけで$VAR
にアクセスする方法はありますか?
ソースを使わずに
$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の設定をあなたに与えないので対話的な使用には不便ですが非常に役に立ちます。
最初に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
ファイルから環境変数をエクスポートするための面白くて綺麗な方法を見つけました:
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
Execute
set -o allexport
これ以降にファイルから取得した変数はすべてシェルにエクスポートされます。
source conf-file
完了したら実行します。これはallexportモードを無効にします。
set +o allexport
場合によっては、エクスポートされた変数を継承する別のbashを作成するという方法もあります。それは@Keith Thompsonの答えの特定のケースです、これらの欠点のすべてになります。
export.bash:
# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
今:
./export.bash
echo $VAR
答えは「いいえ」ですが、私にとっては次のようにしました。
スクリプト:myExport
#! \bin\bash
export $1
私の.bashrcのエイリアス
alias myExport='source myExport'
それでもあなたはそれをソースします、しかしたぶんこのようにそれはより有用でありそしてそれは他の誰かにとって興味深いものです。
多分あなたは〜/ .zshrc、〜/ .bashrcに関数を書くことができます。
# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }
外部で変数を使用しているため、スクリプトファイルの書き込みを避けることができます。