Bash:如何使用连字符(-)取消设置环境变量?

5
我在我的环境中有一些变量的标识符无效。当我尝试取消设置它们时,会出现以下错误:
$ unset A-B
bash: unset: `A-B': not a valid identifier

如何取消它们?

2
为什么在bash 4.1.2中无法访问带有破折号的环境变量?[https://dev59.com/T1oU5IYBdhLWcg3w5pya]虽然不是完全相同的问题,但对于发现此问题有用的人来说,它可能会引起兴趣。 :) - Charles Duffy
1
陷入这个陷阱的一种方法:env "foo-bar=baz" bash - bishop
4
纯好奇,这会成为什么问题呢? - rici
bash 启动时,它会在环境中查找有效标识符名称,并创建用这些值初始化的 shell 变量。它正确地忽略了那些不是有效标识符的名称(根据 POSIX 标准:“Shell 和 Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和可移植字符集中定义的 <下划线>(‘_’)组成,且不以数字开头。其他字符可能会被某些实现所允许;应用程序应容忍存在这样的名称。”)。 - chepner
2个回答

2

关于 Honza P 的回答:

根据 man bash,环境变量的形式为 name=value,其中 name 只包含字母数字字符和下划线,并以字母字符或下划线开头。因此,名称 A-B 是 Bash 的无效变量标识符,不能被使用或访问,因为它具有内部验证(由于 Bash 本身的漏洞,在后期 Bash 版本中强制执行)。唯一的解决方案是启动另一个次级子 shell,使用实用程序 env 在启动 Bash 之前擦除具有问题的名称:

env -u 'A-B' bash

请注意,单引号不是必需的,但对我来说更易读,因为它表示字符串内的文本,而不是其他命令。

如果您有更多变量,只需用空格分隔列出它们,或者如果您想运行没有变量的脚本,您可以使用例如:

env -u 'A-B' 'OTHER-VAR' 'bad-name' bash -c 'myscript.sh arg1 arg2'

子Shell将使用参数arg1arg2运行myscript.sh,并退出到当前Bash Shell。请参考'env'的man页面:man env

0

这可能不是最好的解决方案,但在我的情况下它起作用了。

我尝试了 bishop 的一个例子 env -u "foo-bar=baz",然后是 env -u "foo-bar",但这种方法仍然会在变量中留下一些垃圾,例如 _=foo-bar。所以我使用了 unset _,然后它就消失了。


$_是一个特殊的bash变量,它包含“前一个简单命令的最后一个参数”,因此不需要将其unset;它正按预期工作。但是,env -u并不能回答这个问题,因为它需要启动一个子进程。这个问题是关于在当前bash进程中取消设置环境变量的。 - dimo414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接