文章出處

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()