如何在 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

如果没有 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$ 

我们可以看到这个新bashshell 没有设置奇怪的变量。

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

如果您知道所有变量名称,这很容易;只需列出它们

如果您不知道名称,但可以识别一种模式(例如,所有变量都以“odd”开头),那么您可以构建一个命令:

例如

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

相关内容