bash script
というファイルがありますVAR_A
私も地元env variable
の名前があります。VAR_A
呼び出しbash script
コマンド:
echo ${VAR_A}
スクリプトの変数を別の名前に変更することはできませんが、スクリプトがコマンドを呼び出す方法は変更できますecho
。
スクリプトに提供されているコマンドの代わりにecho
ローカルコマンドを印刷するようにコマンドを変更するにはどうすればよいですか?env variable
UPDATE FOR CLARITY:
状態:
ユーザーに.bashrc
ログイン時に設定された既存のファイルがあります。
VAR_A="someValue"
export VAR_A
これにより、ユーザーは次のことができます。
~]$ echo ${VAR_A}
someValue
Bashスクリプト用のいくつかの設定ファイルがあります
VAR_A="someOtherValue"
Bashスクリプトがあります。
#!/bin/bash
. ../configuration # imports config file with some values
# do stuff
echo ${VAR_A}
端末(ログインしたユーザーとしてbashシェル)でスクリプトを実行すると、次のものが印刷されます。
~]$ ./run_script.sh
someOtherStuff
印刷するには、次のものが必要です。
~]$ ./run_script.sh
someStuff
ベストアンサー1
シェル変数は各シェルの環境変数で初期化されるため、この問題を解決することはできません。
シェルが起動すると、有効な名前のシェル変数として受け取られる各環境変数に対して、シェルはそのシェル変数に適切な値を指定します。たとえば、スクリプトが次のように起動した場合:
env VAR_A=xxx your-script
(そしてshe-bangがあります#!/bin/bash -
)がenv
実行され、対応するbashコマンドに/bin/bash
渡され、その変数に値が割り当てられます。VAR_A=xxx
bash
$VAR_A
xxx
Bourne シェルと C シェルでシェル変数に新しい値を割り当てても、後でシェルで実行されるコマンドに渡される環境変数には影響しません。これを達成するには、export
またはを使用する必要があります。setenv
Bourne シェルでは、unset
変数を使用するとシェル変数と環境変数が削除されます。
存在する:
env VAR=xxx sh -c 'VAR=yyy; other-command'
(sh
現代のPOSIXシェルではなくBourneシェル)または:
env VAR=xxx csh -c 'set VAR = yyy; other-command'
other-command
VAR=xxx
その環境でこれを受け取るには、代わりにVAR=yyy
次のように書く必要があります。
env VAR=xxx sh -c 'VAR=yyy; export VAR; other-command'
または
env VAR=yyy csh -c 'setenv VAR yyy; other-command'
その環境で受信されますother-command
。VAR=yyy
しかし、(POSIXと他のすべての現代のBourne様シェルが明らかになったksh
ように)、この問題が発生しました。bash
起動時に最新のシェル製本その環境変数にシェル変数を追加します。
これは、変数をエクスポートしなくても、スクリプトが変数の1つを設定するだけで環境を破壊する可能性があることを意味します。一部のシェルは、シェル変数にマップできない環境変数も削除します。したがって、シェルマッピング可能変数名のみを環境変数名として使用することをお勧めします。
これが慣例に従って、すべての大文字変数が環境変数用に予約されなければならない主な理由です。
この問題を解決するには、スクリプトによって実行されるコマンドがスクリプトを解釈するシェルと同じ環境を受け取るようにするには、何らかの方法でその環境を保存する必要があります。以下を追加するだけです。
my_saved_env=$(export -p)
スクリプトの先頭に次のコマンドを実行します。
(eval "$my_saved_env"; exec my-other-command and its args)
シェルbosh
とmksh
シェル、地元の関数の変数は環境変数を破壊しません(環境変数を破壊しない限り)。ただし、一部の特殊変数(たとえば、実行可能な照会のためのfor、...)をexport
使用するシェル組み込み機能は、次のものを使用します。HOME
cd
PATH
シェル(ローカル)変数、環境変数ではありません。
$ env VAR=env mksh -c 'f() { local VAR=local; echo "$VAR"; printenv VAR; }; f'
local
env