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

紫雲飛發表於2015-11-27

即便 Bash 沒有從父程式繼承任何的環境變數,Bash 自己也會建立三個環境變數,分別是:

$ env -i bash -c export

declare -x OLDPWD

declare -x PWD="/"

declare -x SHLVL="1"

SHLVL

如果父程式傳遞了 SHLVL 環境變數,那麼 Bash 會在那個值的基礎上累加 1,如果沒有傳,則賦初始值 1:

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

23

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

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 作者表示他準備判斷一下,如果是合法目錄路徑的話,才會繼承。

相關文章