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
謝謝
如果沒有 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