program
環境変数を設定して、いくつかの構成に依存するプログラムがあるとします。今、私は10の異なる環境変数で私のローカル環境を汚染したくないので、この場合スクリプトは役に立つと思いました。
set VAR1=...
set VAR2=...
.
.
# run the program
./program
unset VAR1
unset VAR2
.
.
./program
したがって、実行するのではなく、今このスクリプトを実行します。私の質問は、これが仕事をする慣用的な方法であることです。私が知る必要があるより良い方法はありますか?
答え1
Bourneにrc
似たシェルで環境変数を1回のコマンド呼び出しに渡すには、次のようにします。
VAR1=value VAR2=other-value some-command with its args
ただし、一部のシェルでは、ifはsome-command
特別な組み込み関数(たとえばexport
、、、 )、または変数が設定されたままにset
なるeval
関数です(常にエクスポートされません)。
csh または tcsh シェルに対応するものはありませんが、これらのシェル (または関連シェル) では常に次のenv
コマンドを使用できます。
env VAR1=value VAR2=other-value some-command with its args
env
名前が有効なシェル変数名前ではなく環境変数を渡したい場合(これらの変数はお勧めできません)、Bourneなどのシェルでもそれを使用する必要があります。たとえば、次のようになります。
env C++=/usr/bin/g++ some-command with its args
cshでは、set var=value
必要な環境変数ではなくシェル変数が設定されますsetenv var value
。
シェルでは、次のように変数を環境にエクスポートしながら変数の範囲を制限fish
できます。set -lx
begin...end
begin
set -lx VAR1 value
set -lx VAR2 other-value
some-command with its args
end
zsh
匿名関数を使用して同じことを実行できます。
(){
local -x VAR1=value VAR2=other-value
some-command with its args
some-other-command with other args
}
または:
function {
local -x VAR1=value VAR2=other-value
some-command with its args
some-other-command with other args
}
VAR1=value VAR2=other-value some-command with its args
ただし、その環境で複数のコマンドを実行する場合にのみ標準構文を使用することをお勧めします。
Bourneなどのシェルでは、サブシェルを使用して変数の割り当て範囲を制限することもできます。
(
VAR1=value VAR2=other-value
export VAR1 VAR2
some-command with its args
some-other-command with other args
)
POSIXシェル(Bourneシェルではありませんが、Bourneシェルは過去のものです)は、引数の特殊な組み込み関数にexport
値を割り当てることもできます。
(
export VAR1=value VAR2=other-value
some-command with its args
some-other-command with other args
)
この方法は次の目的にも使用できます(t)csh
。
(
setenv VAR1 value
setenv VAR2 other-value
some-command with its args
some-other-command with other args
)
名前が有効なシェル変数名前以外の変数を使用している環境で複数のコマンドを実行するには、常にenv
startを使用するzsh
か、環境からこれらの変数を削除しない他のシェルを使用できます。bash
csh
# most shell syntax:
env C++=/usr/bin/g++ zsh -c '
some-command with its args
some-other-command with other args
'
# (t)csh syntax
env C++=/usr/bin/g++ csh -c '\
some-command with its args\
some-other-command with other args\
'
さらに、((t)cshおよびほとんどのBourne様シェルで使用される)unset
変数設定は、以前の変数値を復元するのと同じではありません。上記のサンプルコードの後、最初に設定されていなかった変数のみが最終的に設定解除されます。unset var
unset -v var
bash
var = ()
rc
set -e var
fish
答え2
プログラムの実行がスクリプトで最後に実行する操作である場合、つまりスクリプトの残りの部分で環境を「汚染」することを心配する必要はなく、変数を設定解除する必要はありません。環境変数のエクスポートは現在のプロセスとその子プロセスにのみ影響し、親プロセスの環境は変更できません。スクリプトが終了すると、変数は消えます。
export
ただし、環境にエクスポート変数を使用し、set
シェルでローカルにのみ設定する必要があります。