Shell 在 MacOS 及 Linux 中的文件讀取順序

Shell 在 MacOS 及 Linux 中的文件讀取順序

himg

MacOS 與 Linux 中 zsh 的加載順序

Interactive login Interactive non-login Script
/etc/zshenv A A A
~/.zshenv B B B
/etc/zprofile C
~/.zprofile D
/etc/zshrc E C
~/.zshrc F D
/etc/zlogin G
~/.zlogin H
~/.zlogout I
/etc/zlogout J

如文章首圖與上表所示, zsh / bash / sh 都有針對(duì)于 login / nologininteractive, non-interactive 的不同讀取順序. 主要分為以下四種情形

  • interactive - login: 登錄遠(yuǎn)程主機(jī)(e.g ssh)
  • interactive - non-login: 打開一個(gè)新 terminal 或一個(gè)新建 terminal 窗口
  • non-interactive - non-login: 執(zhí)行一個(gè)腳本所在的 sub-shell 就處于這種狀態(tài)(這種狀態(tài)下不能進(jìn)行交互, 這種狀態(tài)也只存在于腳本執(zhí)行的d短暫時(shí)間內(nèi))
  • non-interactive - login: 這種情況很少見, 比如這種情況 echo 'echo $-; shopt login_shell' | ssh localhost

特別值得強(qiáng)調(diào)的是, 在 MacOS 中, 如果我們打開一個(gè) terminal 或新開一個(gè)tab時(shí), zsh 會(huì)將其作為 login 對(duì)待. 當(dāng)然, 在運(yùn)行腳本所創(chuàng)建的 sub-shell 中,
其狀態(tài)都是 non-interactive

Mac 下的 /etc/zprofile 對(duì) PATH 做的奇怪事情

在 Mac 下有 /etc/zprofile 文件, 在這個(gè)文件中有這樣一段命令

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

由首圖及上表可知, zsh 會(huì)在 ~/.zshenv 之后加載 /etc/zprofile, 進(jìn)而執(zhí)行 /usr/libexec/path_helper 這個(gè)腳本, 根據(jù)這個(gè) blog 的描述, 這個(gè)腳本工具會(huì)將變量 $PATH 的順序重排, 同時(shí)讀取 /etc/paths/etc/manpaths 中的 path. 順著這個(gè)思路, 如果我們?cè)?zshenv 中定義了 $PATH, 那么精心配好的順序無(wú)疑會(huì)被打亂.

由此我們可以得出一個(gè)結(jié)論: 變量 $PATH 的定義必須必須放在 /etc/zprofile 之后

MacVim 中讀取到的 $PATH

由于 MacOS 的特殊性(如果我們打開一個(gè) terminal 或新開一個(gè) tab 時(shí), zsh 會(huì)將其作為 login 對(duì)待), 在開啟 MacVim 時(shí), MacVim 讀取到的文件順序與 login - non-interactive 是相同的

也就是說(shuō), MacVim 不會(huì)讀取 ~/.zshrc, 會(huì)讀取 ~/.zprofile, 那么如果我們需要在 MacVim 中獲得正確的 $PATH, 就必須將 $PATH 及一些其他基本變量的設(shè)置
放在 ~/.zprofile

打造一個(gè)兼容各個(gè)系統(tǒng)的 zsh 配置

我使用的是 zsh, 我覺(jué)得非常順手, 各種功能強(qiáng)大, 兼容主流平臺(tái), 因此我的所有工作環(huán)境都會(huì)使用 zsh. 由于平時(shí)會(huì)使用 MacOSLinux,
而且想要將自己的一些個(gè)性化配置在不同環(huán)境下通用, 那么就需要考慮下如何在 MacOS, MacVim, ssh remote, Linux Desktop 下有統(tǒng)一的加載行為.

經(jīng)過(guò)考慮, 我目前的方案是:

  1. 創(chuàng)建一個(gè) init.zsh 腳本, 在其中有各種變量的定義, 包括 $PATH. 在腳本開始進(jìn)行加載的判斷(防止同一次啟動(dòng)中重復(fù)加載次腳本)

    if [ -z "$_INIT_ZSH_LOADED" ]; then
        _INIT_ZSH_LOADED=1
    else
        return
    fi
    
  2. .zprofile 的開頭 source init.zsh

  3. .zshrc 的開頭 source init.zsh

  4. .zlogin 中使用想要顯示的交互信息(比如 neofetch 信息)

這里附上我的 shell 配置倉(cāng)庫(kù), 供各位參考

https://github.com/HanleyLee/dotsh

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肺缕,一起剝皮案震驚了整個(gè)濱河市左医,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌同木,老刑警劉巖浮梢,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異彤路,居然都是意外死亡秕硝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門洲尊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)远豺,“玉大人,你說(shuō)我怎么就攤上這事坞嘀∏ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵丽涩,是天一觀的道長(zhǎng)棺滞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)矢渊,這世上最難降的妖魔是什么继准? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮矮男,結(jié)果婚禮上移必,老公的妹妹穿的比我還像新娘。我一直安慰自己昂灵,他們只是感情好避凝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眨补,像睡著了一般管削。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撑螺,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天含思,我揣著相機(jī)與錄音,去河邊找鬼。 笑死含潘,一個(gè)胖子當(dāng)著我的面吹牛饲做,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遏弱,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼盆均,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了漱逸?” 一聲冷哼從身側(cè)響起泪姨,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饰抒,沒(méi)想到半個(gè)月后肮砾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袋坑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年仗处,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枣宫。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婆誓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镶柱,到底是詐尸還是另有隱情旷档,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布歇拆,位于F島的核電站鞋屈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏故觅。R本人自食惡果不足惜厂庇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望输吏。 院中可真熱鬧权旷,春花似錦、人聲如沸贯溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)它浅。三九已至译柏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姐霍,已是汗流浹背鄙麦。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工典唇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胯府。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓介衔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骂因。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炎咖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容