プログラムを実行するときに環境変数を設定および設定解除するには?

プログラムを実行するときに環境変数を設定および設定解除するには?

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 -lxbegin...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
)

名前が有効なシェル変数名前以外の変数を使用している環境で複数のコマンドを実行するには、常にenvstartを使用するzshか、環境からこれらの変数を削除しない他のシェルを使用できます。bashcsh

# 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 varunset -v varbashvar = ()rcset -e varfish

答え2

プログラムの実行がスクリプトで最後に実行する操作である場合、つまりスクリプトの残りの部分で環境を「汚染」することを心配する必要はなく、変数を設定解除する必要はありません。環境変数のエクスポートは現在のプロセスとその子プロセスにのみ影響し、親プロセスの環境は変更できません。スクリプトが終了すると、変数は消えます。

exportただし、環境にエクスポート変数を使用し、setシェルでローカルにのみ設定する必要があります。

関連情報