我在我的环境中有一些变量的标识符无效。当我尝试取消设置它们时,会出现以下错误:
如何取消它们?
$ unset A-B
bash: unset: `A-B': not a valid identifier
如何取消它们?
$ unset A-B
bash: unset: `A-B': not a valid identifier
关于 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'
arg1
和arg2
运行myscript.sh
,并退出到当前Bash Shell。请参考'env'的man页面:man env
。这可能不是最好的解决方案,但在我的情况下它起作用了。
我尝试了 bishop 的一个例子 env -u "foo-bar=baz"
,然后是 env -u "foo-bar"
,但这种方法仍然会在变量中留下一些垃圾,例如 _=foo-bar
。所以我使用了 unset _
,然后它就消失了。
$_
是一个特殊的bash变量,它包含“前一个简单命令的最后一个参数”,因此不需要将其unset
;它正按预期工作。但是,env -u
并不能回答这个问题,因为它需要启动一个子进程。这个问题是关于在当前bash进程中取消设置环境变量的。 - dimo414
env "foo-bar=baz" bash
- bishopbash
启动时,它会在环境中查找有效标识符名称,并创建用这些值初始化的 shell 变量。它正确地忽略了那些不是有效标识符的名称(根据 POSIX 标准:“Shell 和 Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和可移植字符集中定义的 <下划线>(‘_’)组成,且不以数字开头。其他字符可能会被某些实现所允许;应用程序应容忍存在这样的名称。”)。 - chepner