即使 Bash 沒有從父進程繼承任何的環境變量,Bash 本身也會建立三個環境變量,分別是:html
$ env -i bash -c exportbash declare -x OLDPWD函數 declare -x PWD="/"htm declare -x SHLVL="1"繼承 |
若是父進程傳遞了 SHLVL 環境變量,那麼 Bash 會在那個值的基礎上累加 1,若是沒有傳,則賦初始值 1:進程
$ env -i SHLVL=22 bash -c 'echo $SHLVL' # 原值基礎上累加 1get 23zsh $ env -i bash -c 'echo $SHLVL' # 賦初始值 1table 1基礎 |
若是父進程傳遞了 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 環境變量,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 做者表示他準備判斷一下,若是是合法目錄路徑的話,纔會繼承。