我正在尝试向现有的 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$
我们可以看到这个新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$
如果您知道所有变量名称,这很容易;只需列出它们
如果您不知道名称,但可以识别一种模式(例如,所有变量都以“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