“export var=value”在哪裡不可用?
我發現——可能是在 1990 年代中期的 Usenet 上(!)——構造
export var=value
是 Bashism,而可移植的表達式是
var=value export var
多年來我一直在提倡這一點,但最近,有人向我提出質疑,我真的找不到任何文件來支持我曾經堅定的信念。
Google搜尋
"export: command not found"
似乎並沒有提出任何人實際上遇到這個問題的情況,所以即使它是真的,我想它也不是很常見。(我得到的點擊似乎是複制/粘貼標點符號的新手,並以
'export: command not found
或類似的方式結束,或嘗試使用export
with ;以及嘗試使用 Bourne shell 語法的sudo
新手使用者。)csh
我可以肯定地說它適用於 OS X 和各種 Linux 發行版,
sh
包括dash
.sh$ export var=value sh$ echo "$var" value sh$ sh -c 'echo "$var"' # see that it really is exported value
在當今世界,可以說
export var=value
使用安全嗎?我想了解後果是什麼。如果它不能移植到 v7 “Bourne classic”,那隻不過是瑣事。如果存在 shell 確實無法處理這種語法的生產系統,那麼了解這一點會很有用。
export foo=bar
不受 Bourne shell(70 年代的舊 shell,
sh
ash/bash/ksh/yash/zsh 等現代實現派生而來)的支持。那是由ksh
.在 Bourne shell 中,你會這樣做:
foo=bar export foo
或者:
foo=bar; export foo
或與
set -k
:export foo foo=bar
現在,行為:
export foo=bar
因殼而異。
問題在於分配和簡單的命令參數的解析和解釋方式不同。
上面的
foo=bar
內容被某些 shell 解釋為命令參數,而其他 shell 則解釋為賦值(有時)。例如,
a='b c' export d=$a
被解釋為:
'export' 'd=b' 'c'
使用一些外殼(
ash
,舊版本的zsh
(在 sh 仿真中),yash
)和:'export' 'd=b c'
在其他 (
bash
,ksh
) 中。儘管
export \d=$a
或者
var=d export $var=$a
在所有 shell (as
'export' 'd=b' 'c'
) 中將被解釋為相同,因為反斜杠或美元符號會阻止那些支持它的 shell 將這些參數視為賦值。如果
export
它本身被引用或者是某些擴展的結果(甚至是部分擴展),取決於外殼,它也將停止接受特殊處理。請參閱局部變數賦值是否需要引號?有關詳細資訊。
Bourne 語法:
d=$a; export d
所有 shell 的解釋都是一樣的,沒有歧義(
d=$a export d
也可以在 Bourne shell 和 POSIX 兼容的 shell 中工作,但在最近版本的zsh
除非在sh
仿真中)。它可能會變得更糟。例如,參見最近關於
bash
何時涉及數組的討論。(IMO,引入該功能是錯誤的)。
它不是 bashism,而是符合 POSIX 的語法。它實際上在很久以前作為 kshism 開始,後來被幾乎所有基於 Bourne 語法的 shell 採用。唯一臭名昭著的例外是
/bin/sh
在 Solaris 10 及更早版本上,它堅持傳統的 Bourne shell 語法。希望 Solaris 11 使用符合 POSIX 的 shell 作為/bin/sh
.順便說一句,
export
它已經是舊版 Bourne shell 中的內置命令,因此在Google上搜尋export: command not found
會產生誤導。
export
這是與賦值結合使用時的遺留 Bourne shell 行為:$ export var=22 var=22: is not an identifier
對於懷舊者,這個
原始Bourne shell的原始碼是可用的,並且可以為大多數 Unix 和 Linux 發行版編譯。