Bash 會清空從父進程繼承來的 OLDPWD

即使 Bash 沒有從父進程繼承任何的環境變量,Bash 本身也會建立三個環境變量,分別是:html

$ env -i bash -c exportbash

declare -x OLDPWD函數

declare -x PWD="/"htm

declare -x SHLVL="1"繼承

SHLVL

若是父進程傳遞了 SHLVL 環境變量,那麼 Bash 會在那個值的基礎上累加 1,若是沒有傳,則賦初始值 1:進程

$ env -i SHLVL=22 bash -c 'echo $SHLVL' # 原值基礎上累加 1get

23zsh

$ env -i bash -c 'echo $SHLVL' # 賦初始值 1table

1基礎

PWD

若是父進程傳遞了 PWD 環境變量,且該環境變量的值是當前目錄的路徑,且是個絕對路徑,則 Bash 會直接繼承這個值,不然 Bash 會本身調用 getcwd C 函數獲取當前工做目錄賦值給 PWD。

$ env -i PWD=/ bash -c 'echo $PWD' # 直接繼承,沒有調用 getcwd C 函數

/

$ env -i PWD=/etc bash -c 'echo $PWD' # 不是當前目錄的路徑,本身給 PWD 賦值

/

$ env -i PWD=. bash -c 'echo $PWD' # 是當前目錄的路徑,可是是個相對路徑,本身給 PWD 賦值

/

OLDPWD

若是父進程傳遞了 OLDPWD 環境變量,Bash 會直接清空這個變量的值。

$ env -i OLDPWD=/etc bash -c 'echo $OLDPWD'

 

$ env -i OLDPWD=/etc ksh -c 'echo $OLDPWD'

/etc

$ env -i OLDPWD=/etc csh -c 'echo $OLDPWD'

/etc

$ env -i OLDPWD=/etc zsh -c 'echo $OLDPWD'

/

可見不一樣於 Bash,ksh 和 csh 會直接繼承那個值,而 zsh 會用當前工做目錄的值改寫繼承來的 OLDPWD 變量的值。

有人在 bug-bash 上提了這個問題  http://lists.gnu.org/archive/html/bug-bash/2015-11/msg00115.html,Bash 做者表示會在下個版本嘗試改變這個行爲,但並非照抄 ksh 和 csh 的作法,ksh 和 csh 只是簡單的繼承了 OLDPWD 的值,並不判斷那個值是否是個合法的且存在的目錄的路徑:

$ env -i OLDPWD=2333 ksh -c 'echo $OLDPWD'

2333

$ env -i OLDPWD=2333 csh -c 'echo $OLDPWD'

2333

而 Bash 做者表示他準備判斷一下,若是是合法目錄路徑的話,纔會繼承。

相關文章
相關標籤/搜索