在bash中设置以数字开头的环境变量

7

我需要在bash中设置一个名为“64bit”的环境变量(即以数字开头),但是bash变量名不允许以数字开头。我知道一种在调用bash时设置它的方法:

env 64bit=1 /usr/bin/bash

然而,我正在寻找一种方法来更改当前正在运行的shell中的变量名,即不通过启动新的shell。我也知道csh允许变量以数字开头,但我需要使用bash。

有没有办法实现这个目标?


4
为什么你必须要这个?你不能用另一个名字吗? - Keith Thompson
1
在当前shell中设置环境变量的唯一方法是通过使用bash shell变量,这些变量不能以数字开头。 - chepner
1
这个变量被我公司的配置管理团队使用,并被许多脚本读取。他们使用csh,但是我发现在定义函数/别名方面,csh非常受限(据我所知,它不支持函数)。因此,我转而使用bash并采用上述解决方法,现在正在尝试修复它。 - Haitham Gad
1
从IEEE Posix标准...《IEEE Std 1003.1-2001》Shell和Utilities卷中实用程序使用的环境变量名仅由大写字母、数字和Portable Character Set中定义的下划线字符'_'组成,且不以数字开头。其他字符可能会被实现允许;应用程序必须容忍这些名称的存在。换句话说:告诉你的配置管理人员他们正在违反标准。 - tink
1
@tink:“……在IEEE Std 1003.1-2001的Shell和Utilities卷中使用的变量名称……”(强调是我的)。其他程序可以自由地使用任何字符,这就是为什么env更加宽松的原因。 - chepner
显示剩余4条评论
2个回答

8

您也可以通过绕过bash解释器并使用bash内部函数直接定义变量:

$ gdb --batch-silent -ex "attach $$"                              \
    -ex 'set bind_variable("64bit", "1", 0)'                      \
    -ex 'set *(int*)(find_variable("64bit")+sizeof(char*)*5) = 1' \
    -ex 'set array_needs_making = 1'

$ env | grep 64
64bit=1

5
我认为这是我多年来遇到的最疯狂/聪明的使用gdb的方法。 - danfuzz

1
作为人们指出的,Bash 不允许以数字开头的变量。但它确实会将未识别的环境字符串传递给外部程序,这就是为什么变量显示在 env 中而不在 set 中的原因。
为了解决这个问题,您可以使用一个有效的名称,比如 _64bit,然后自动将无效的变量名注入到您运行的命令中。
#!/bin/bash    
# Setup for injection hack
original=$PATH
PATH="/"
command_not_found_handle() {
  PATH="$original" env "64bit=$_64bit" "$@"
}

# Your script and logic
_64bit="some dynamic value"

# This verifies that '64bit' is automatically set
env | grep ^64bit

请注意,此特定方法仅在通过$ PATH调用时有效,而不是使用相对或绝对路径名。
如果您通过路径名调用,请考虑修改PATH并改为按名称调用。

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