2013-03-19 38 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並按名稱調用。