コマンドの環境変数の設定解除

コマンドの環境変数の設定解除

特定の値を使用して実行できますENV_VAR=value command。 unsetと同等のものは何ですか?commandENV_VARENV_VARcommand

ベストアンサー1

-iPOSIXは、環境全体を消去するオプションに加えてenv変数を設定解除する方法を提供しません。

ただし、一部のenv実装(少なくともGNUbusyboxとFreeBSDを含む)では、次のことができます。

env -u ENV_VAR command

ENV_VARこれは、環境から変数のすべてのインスタンスを削除するのに役立ちます。名前が空の環境変数では機能しません(env -u ''すべてが許可されていても、実装によってはエラーが発生したり、何の影響もなく、制限になる可能性env '=value'があります)。 C関数のため、unsetenv()POSIXでは空の文字列エラーを返す必要がありますが))にはそのような制限はありませんputenv()

移植可能に(POSIX シェルで)次のことができます。

(unset -v ENV_VAR; exec command)

(一部のシェルでは、コマンドを使用すると実行が変更される可能性がありexecますcommand。上記のように関数または組み込みの代わりにファイルシステムでコマンドを実行します(alias明らかに拡張をバイパスします)env。この場合は無視する必要があります。

mkshただし、これは名前をシェル変数にマップできない環境変数(一部のシェルはとにかく起動時に環境からこれらの変数を削除することに注意してください)、または読み取り専用としてマークされた変数には適用されません。

-vBourne シェルで使用され、使用できないbash場合は設定を解除できます。unset-vENV_VAR 機能もしなければ変えるこの名前で。他のほとんどのシェルは、このオプションを渡さないと機能設定をオフにしません-f。 (実際には影響を与える可能性が低いです。)

bash(また、//のmkshバグ/yash間違った機能によってunset変数が設定解除されない可能性がありますが、外部範囲に変数を表示)

その場合は、perl次のようにできます。

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

これは、名前が空の環境変数でも機能します。

これで、組み込み関数や関数の環境変数を変更し、サブシェルで実行したくない場合は、これはすべて機能しませんbash

env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards

(ここでLANGを設定解除すると、少数区切り記号を使用して理解できるように誤解を招く方法があります。.使用する方が良いですLC_ALL=C printf...。)

一部のシェルでは、関数を使用して変数のローカルスコープを作成できます。

without() {
  local "$1" # $1 variable declared as initially unset in bash¹
  shift
  "$@"
}
without LANG printf -v var %.3f 1.2

Passを使用すると、zsh匿名関数を使用することもできます。

(){local ENV_VAR; command}

localこのメソッドは、変数を最初に設定解除されたと宣言しない(ただし、値と属性を継承する)一部のシェル(たとえば、Almquistシェルベースのシェル)では機能しません。この場合はできますが、または(代わりに)実行しないlocal ENV_VAR; unset ENV_VARでください。動作せずキャンセルされるからです。mkshyashtypesetlocalunsetlocal

また、bashローカルENV_VAR(設定されていない場合でも)はそのまま残ります。出口属性。したがって、command関数に値が割り当てられると、ENV_VAR後で呼び出されるコマンド環境で変数を使用できます。unset ENV_VARこの属性は消去されます。あるいは、きれいな状態を保証するためにそれを使用することもできますlocal +x ENV_VAR(変数が読み取り専用として宣言されていない場合は、これができることはあまりありませんbash)。

おすすめ記事