Bash

如何在 bash 中取消設置無效的環境變數?

  • April 23, 2022

我正在嘗試向現有的 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

謝謝

如果沒有 docker 和其他混淆,這可能更容易理解。您有一個帶有“奇怪”名稱的環境變數,您想從傳遞給子程序的環境中刪除它,但您不能使用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的 shell 沒有設置奇數變數。

您可以使用多個 -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

引用自:https://unix.stackexchange.com/questions/700132