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

2021-09-07 03:56:15 字數 1260 閱讀 3554

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

$ env -i bash -c export

declare -x oldpwd

declare -x pwd="/"

declare -x shlvl="1"

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

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

$ env -i bash -c 'echo $shlvl' # 賦初始值 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 上提了這個問題   作者表示會在下個版本嘗試改變這個行為,但並不是照抄 ksh 和 csh 的做法,ksh 和 csh 只是簡單的繼承了 oldpwd 的值,並不判斷那個值是不是個合法的且存在的目錄的路徑:

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

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

而 bash 作者表示他準備判斷一下,如果是合法目錄路徑的話,才會繼承。

RECONFIGURE語句會清空計畫快取麼?

幾個星期前,有個問我乙個非常有趣的問題 reconfigure語句會清空計畫快取麼?通常我對這個問題的答案是簡單的是,但慢慢的我找出了真正的答案是 看情況啦 我們來看下它,為什麼 它看情況 通常你會期望reconfigure語句會清空執行計畫,但遺憾的是這不是真相。執行計畫只有當你修改特定的配置項時...

霍尼韋爾互聯創新技術將登陸進博會

上海2018年10月31日電 美通社 首屆中國國際進口博覽會 以下簡稱進博會 將於11月5日到10日在國家會展中心 上海 舉辦,霍尼韋爾將攜一系列創新的互聯產品和解決方案亮相智慧型及高階裝備展區 4.1展館c4 01 全面展示前沿的互聯產品和技術及在互聯工業領域所作出的努力。此次進博會期間,霍尼韋爾...

進臨界區 關全域性中斷 是否會影響資料的接收

在嵌入式的程式設計中,經常會使用嵌入式實時作業系統,比如freertos,rtt等。而在使用這些作業系統時,會有乙個臨界區的概念,一般操作是 1,進入臨界區 2,操作不能被執行緒打斷的語句 3,退出臨界區 而進入臨界區的具體操作往往就是關掉系統的所有可以關閉的中斷。這裡有乙個問題,如果有乙個外設剛剛...