シェルスクリプトで環境変数を設定解除する最も防御的で強力な方法

シェルスクリプトで環境変数を設定解除する最も防御的で強力な方法

スクリプトで環境変数を設定解除する最も防御的で強力で、移植可能で編集可能な方法は何ですか?

env -i some-command私は、外部ツールを使用してのような環境変数を消去またはperl -e 'delete $ENV{SOME_VARIABLE}; exec("some-command")'回避できる場合は、回避しようとしています。

現在としては使用しています。

export SOME_VARIABLE; unset -v SOME_VARIABLE

SOME_VARIABLE同じ名前のシェル変数やシェル関数が存在しても削除されると思います。 (シェル変数が存在する場合は破壊されますが)。

ベストアンサー1

unset SOME_VARIABLESOME_VARIABLE環境から削除されました。これはほとんどすべての状況で必要なすべてです。まれに、これが十分でない場合は、中間プロセス呼び出しを避けることはできません(ただし、別のインスタンスである可能性がありますsh)。

export後で電話してもunset -v不利益はありません。後で設定を解除したい場合は、変数をエクスポートする必要はありません。関数は環境に保存されないため、unset -v子プロセスが表示する内容には影響しません。

一部のシェルは環境を介して関数をエクスポートしますが、関数定義を変数定義にエンコードして実行します。変数名が関数名と同じ場合はunset FUNCTION_NAME処理され、それ以外の場合はunset -v FUNCTION_NAME何も実行されませんunset FUNCTION_NAME

変数の設定を解除できない極端なケースは、変数が読み取り専用として宣言されている場合です。変数を読み取り専用状態から通常状態に復元する移植可能な方法はありません。環境から読み取り専用変数を移植可能に削除するには、シェルの他のコピーを呼び出す必要があります。

readonly foo=bar
export foo
sh -c 'unset foo; exec some-command'

別の極端なケースは、いくつかのシェルがいくつかの変数を定義するために持続し、自動的に設定解除されるのを防ぐことです。環境から削除するには、他のシェルまたは類似のenvディンドルユーティリティを使用する必要があります。

おすすめ記事