Bashで無効な環境変数を設定解除するには?

Bashで無効な環境変数を設定解除するには?

既存のdocker-entrypointスクリプトに機能を追加しようとしましたが、イメージ作成者は環境変数の型をkey.subkey = valueにしました。私は私の変数を設定して解析するまで、これが間違った命名スキームであることを知りませんでした。命名スキームが無効であるため、次のように読みます。

while IFS='=' read -r var key
do
# parse
done < <(env)

私が望むのは、使用後に自分自身の「無効な」環境変数を設定解除する修正されたエントリポイントをインストールすることです。それ以外の場合、私の変数は正規表現パターンによって捕捉され、スクリプトは終了します。これは、キャプチャされた変数をバイナリにオプションとして渡すためです。

とにかくDockerの環境変数機能を使用して強制的に設定された誤った変数を元に戻すことはできますか?私がこれをしようとしたとき:

unset -v foo.foo-bar.setting-to-update

私は得る:

bash: unset: `foo.foo-bar.setting-to-update': not a valid identifier

ありがとう

ベストアンサー1

ドッカーやその他の混乱なしに理解しやすくなります。サブルーチンに渡された環境から削除する名前が「odd」の環境変数がありますが、使用できません。unset

例えば

% env odd.variable=100 bash
bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ unset odd.variable
bash: unset: `odd.variable': not a valid identifier

envパラメータを含むコマンドが-u役立ちます。

bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ env -u odd.variable bash
bash-4.2$ env | grep odd
bash-4.2$ 

bashこの新しいシェルには奇妙な変数セットがないことがわかります。

複数の-uオプションを使用して複数の変数を設定解除できます。

したがって、変数が複数ある場合:

bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100

それでは、すべて削除してもいいです。

bash-4.2$ env -u odd.var1 -u odd.var2 -u odd.var3 bash
bash-4.2$ env | grep odd
bash-4.2$ 

すべての変数名を知っていると簡単です。

名前はわかりませんが、パターンを認識できる場合(たとえば、すべての変数が「奇数」で始まる)、コマンドを作成できます。

例えば

to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')

このsedコマンドは必要な-u設定を生成します

例えば

bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100
bash-4.2$ to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')
bash-4.2$ echo $to_remove
-u odd.var2 -u odd.var3 -u odd.var1
bash-4.2$ env $to_remove bash
bash-4.2$ env | grep odd
bash-4.2$ 

警告:変数名または内容に奇妙な文字(組み込みCR / LFシーケンスなど)が含まれると、問題が発生する可能性があります。しかし、一般的な状況では大丈夫でしょう!

これはすべてのプログラムに適用されます。

env -u odd.variable myscript

おすすめ記事