2013-02-04 44 views
0

我試圖找出如何三立和便攜(儘可能)處理與不映射到有效的shell變量名環境變量。關鍵的是結果是逐字節準確的,所以我不願意通過解析輸入env工具等黑客行爲。訪問環境變量沒有映射到有效的shell變量名

env 'Invalid Name=Some Value' bash <<'EOF' 
s='Invalid Name' 
printf '%q\n' "${!s}" 
EOF 

我希望上面的代碼會發出Some Value;不過,它會返回一個空字符串。

+0

我不明白的問題:如何定義的環境變量有一個非有效的名稱? ...我很困惑^^ –

+2

環境是一個操作系統的結構,而不是任何特定的shell。殼只提供了一種機制來將其變量導出到環境中,並且有可能一個shell的有效變量名的概念與另一個不同,它既不包含所有有效的環境變量名。例如,請參閱POSIX規範(http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html)中的定義,該定義指出不允許包含有效字符的環境變量必須是可容忍的,否則必須允許公認。 – chepner

+1

或者更簡單的例子,只需運行'env「foo bar = 3」env | grep foo' – chepner

回答

1

一個不可移植的方法(僅限Linux)是解析/proc/self/environ

declare -A environ 
while IFS='' read -r -d ''; do 
    var=${REPLY%%=*} 
    val=${REPLY#*=} 
    environ[$var]="$val" 
done </proc/self/environ 
printf '%q\n' "${environ["Invalid Name"]}" 
+0

+1可以從'env'命令,而不是'/ proc中/自/ environ'閱讀,使這個更便於攜帶。 – chepner

+0

@chepner'env'命令的輸出在其引用,非ASCII字符等方面是確定性的? –

+0

我不知道這個答案。我懷疑它取決於有效的語言環境。 – chepner