特定の値を使用して実行できますENV_VAR=value command
。 unsetと同等のものは何ですか?command
ENV_VAR
ENV_VAR
command
答え1
-i
POSIXは、環境全体を消去するオプションに加えて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
ただし、これは名前をシェル変数にマップできない環境変数(一部のシェルはとにかく起動時に環境からこれらの変数を削除することに注意してください)、または読み取り専用としてマークされた変数には適用されません。
-v
Bourne シェルで使用され、使用できないbash
場合は設定を解除できます。unset
-v
ENV_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
でください。動作せずキャンセルされるからです。mksh
yash
typeset
local
unset
local
また、bash
ローカルENV_VAR
(設定されていない場合でも)はそのまま残ります。出口属性。したがって、command
関数に値が割り当てられると、ENV_VAR
後で呼び出されるコマンド環境で変数を使用できます。unset ENV_VAR
この属性は消去されます。あるいは、きれいな状態を保証するためにそれを使用することもできますlocal +x ENV_VAR
(変数が読み取り専用として宣言されていない場合は、これができることはあまりありませんbash
)。
答え2
私が知る限り、サブシェルを使用する直接的な方法はありません。
(unset ENV_VAR; exec command)
答え3
あなたはそれを使用することができますENV_VAR= command
これは実際には変数の設定を解除しませんが、多くの状況で役に立ちます(シェルスクリプトはしばしばtest -n
変数が設定されていることを確認するために使用されます)。
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR: