2013-03-19 36 views
4

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

env 64bit=1 /usr/bin/bash 

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

有什么办法可以达到这个目的吗?

+4

为什么你*需要*呢?你不能只用一个不同的名字吗? – 2013-03-19 19:14:22

+0

csh不允许变量以字母开头; “set”和“setenv”都抱怨“变量名必须以字母开头”。 – 2013-03-19 19:15:23

+1

在当前shell中设置环境变量的唯一方法是使用'bash' shell变量,该变量不能以数字开头。 – chepner 2013-03-19 19:17:05

回答

4

您还可以绕过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 
+2

+1我是多年来遇到的最疯狂/最聪明的gdb使用。 – danfuzz 2013-03-19 21:51:05

+0

太棒了:-)这就是我一直在寻找的。 – 2013-03-19 22:21:09

1

正如人们指出的,Bash不允许以数字开头的变量。但它会将未识别的环境字符串传递给外部程序,这就是为什么变量显示在env中,而不是在set中。

作为一种变通方法,您就可以使用_64bit有效名称工作,然后自动注入您的无效变量名称为命令运行:

#!/bin/bash  
# Setup for injection hack 
original=$PATH 
PATH="/" 
command_not_found_handle() { 
    PATH="$original" env "64bit=$_64bit" "[email protected]" 
} 

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

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

请注意,如果您通过$ PATH调用这个特别的方法只适用,如果使用相对或绝对路径名,则不行。

如果通过路径名进行调用,请考虑修改PATH并按名称调用。