/etc/profile和/etc/bashrc、~/.bash_profile和~/.bashrc、.zshrc和.zprofile的區(qū)別

簡(jiǎn)介

默認(rèn)情況下,您的 Mac 使用 zsh 或 bash 作為登錄 Shell 和交互式 Shell 的命令行解釋器:

  • bash 是 macOS Mojave 及更低版本中的默認(rèn) Shell。
  • zsh 從 macOS Catalina 版開始,您的 Mac 將使用 zsh 作為默認(rèn)登錄 Shell 和交互式 Shell。
    與 Bourne Shell (sh) 高度兼容,并且與 bash 基本兼容,但存在一些差別。要進(jìn)一步了解 zsh 及其全面的命令行完成系統(tǒng),請(qǐng)?jiān)凇敖K端”中輸入 man zsh。

如何查看自己使用的是哪一個(gè)shell

echo $SHELL

查看系統(tǒng)安裝了哪些shell

cat /etc/shells

運(yùn)行中的Bash有兩種模式: login shell 和 non-login shell

1、login shell(登錄Shell):就是需要輸入用戶名及密碼登錄的shell,如開機(jī)shell登錄、ssh登錄、su - username(從root切換到其他用戶時(shí)無需密碼)。
2、non-login shell:無需輸入密碼,如bash、su username、圖形界面打開bash。
bashrc用于交互式non-login shell,而profile用于交互式login shell。系統(tǒng)中存在許多bashrc和profile文件

bash Shell

登錄Shell

  1. /etc/profile(系統(tǒng)級(jí)(全局)配置文件):此文件為系統(tǒng)的所有登錄用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí),該文件被執(zhí)行,并從/etc/profile.d目錄的配置文件中搜集shell的設(shè)置。
  2. ~/.bash_profile:每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的
    .bashrc文件。
    此文件類似于/etc/profile,也是需要需要重啟才會(huì)生效,/etc/profile對(duì)所有用戶生效,~/.bash_profile 只對(duì)當(dāng)前用戶生效!
  3. ~/.profile:(針對(duì)個(gè)人)若bash是以login方式執(zhí)行時(shí),讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前兩者不存在,讀取~/.profile。另外,圖形模式登錄時(shí),此文件將被讀取,即使存在~/.bash_profile~/.bash_login
    ~/.zshrc:無論登錄和非登錄用戶都可以讀取

非登錄Shell

  1. /etc/bashrc(系統(tǒng)級(jí)(全局)配置文件):為每一個(gè)運(yùn)行bash shell的用戶執(zhí)行此文件, 當(dāng)bash shell被打開時(shí)或在用戶主目錄下找不到.bashrc時(shí),就會(huì)讀取這該文件。
  2. ~/.bashrc:該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開新的shell時(shí),該文件被讀取.(每個(gè)用戶都有一個(gè).bashrc文件,在用戶目錄下)。
    此文件類似于/etc/bashrc,不需要重啟生效,重新打開一個(gè)bash即可生效, /etc/bashrc對(duì)所有用戶新打開的bash都生效,但~/.bashrc只對(duì)當(dāng)前用戶新打開的bash生效。但一般 來說都會(huì)在~/.bash_profile里調(diào)用~/.bashrc腳本以便統(tǒng)一配置用戶環(huán)境。
    ~/.bashrc等中設(shè)定的變量(局部)只能繼承/etc/profile中的變量,他們是"父子"關(guān)系.
  3. ~/.bash_logout:當(dāng)每次退出系統(tǒng)(退出bash shell)時(shí),執(zhí)行該文件。
  4. ~/.bash_history:是bash shell的歷史記錄文件,里面記錄了你在bash shell中輸入的所有命令??赏ㄟ^HISSIZE環(huán)境變量設(shè)置在歷史記錄文件里保存記錄的條數(shù)。alias l = ‘ls -l’是設(shè)置別名的語句,把它放在這些配置文檔中就可使我們能用簡(jiǎn)單的’l’命令,代替’ls -l’命令。

另外:不要輕易修改 /etc/environment 文件。


zsh Shell

從 macOS Catalina 版開始,您的 Mac 將使用 zsh 作為默認(rèn)登錄 Shell 和交互式 Shell。

~/.zprofile 的作用與 ~/.bash_profile 相同,并且在登錄時(shí)運(yùn)行(包括通過 SSH 運(yùn)行)
~/.zshrc 的作用與 ~/.bashrc 相同,并針對(duì)每個(gè)新的“終端”會(huì)話運(yùn)行

  • 說明: 如何切換到 zsh 描述文件和提示符
    如果您正在使用 bash 描述文件(例如,為了設(shè)置環(huán)境變量、別名或路徑變量),則您應(yīng)改為使用作用與它相同的 zsh 描述文件。

1、如何更改默認(rèn) Shell

無論您的用戶帳戶是配置為使用 zsh(推薦)、bash 還是其他 Shell,您都可以從“用戶與群組”偏好設(shè)置或命令行中更改默認(rèn) Shell。

  • 從“用戶與群組”偏好設(shè)置中更改
    選取蘋果菜單 ? >“系統(tǒng)偏好設(shè)置”,然后點(diǎn)按“用戶與群組”。
    點(diǎn)按鎖形圖標(biāo) ,然后輸入您的帳戶名稱和密碼。
    在左側(cè)的用戶列表中,按住 Control 鍵點(diǎn)按您的用戶名,然后選取“高級(jí)選項(xiàng)”。
    從“登錄 Shell”菜單中選取一個(gè) Shell,然后點(diǎn)按“好”以存儲(chǔ)更改。

  • 從命令行中更改
    在“終端”中,輸入 $ chsh -s path,其中的 path 是 /etc/shells 中列出的某個(gè) Shell 路徑,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh,比如:$ chsh -s /bin/zsh$ chsh -s /bin/bash。

如何在不更改默認(rèn) Shell 的情況下使用其他 Shell
如果您不希望“終端”在新的“終端”窗口和標(biāo)簽頁中使用默認(rèn)的登錄 Shell,請(qǐng)按照以下步驟操作:
打開“終端”,然后選取“終端”>“偏好設(shè)置”。
從“通用”面板中,選擇“命令(完整的路徑)”。
在提供的欄位中,輸入 /etc/shells 中列出的某個(gè) Shell 路徑,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh。

2、在配置文件方面

bash讀取的配置文件:

open -e ~/.bash_profile
// vim ~/.bash_profile
// sudo vim ~/.bash_profile

zsh讀取的配置文件:

open -e ~/.zshrc
// vim ~/.zshrc
// sudo vim ~/.zshrc

沒有電腦不存在,則新建一個(gè)配置文件:

touch .bash_profile //在用戶(~)目錄下
// touch ~/.bash_profile //任何目錄下都可以用這個(gè)命令

當(dāng)從bash切換為zsh時(shí),如果不想重新配置一遍.zshrc文件,可以__在.zshrc文件中加上source ~/.bash_profile,從而直接從.bash_profile文件讀取配置。

使環(huán)境變量生效

source ~/.zprofile

查看變量是否生效

echo $PATH

重啟所有終端

macOS下打開的shell是登錄式交互shell,登錄Shell(不管是不是交互式的)文件加載順序如下:
/etc/profile
~/.bash_profile(,如果安裝了zsh,則.bash_profile 文件中的環(huán)境變量就無法起到作用,會(huì)加載~/.zprofile,這里面可以配置python環(huán)境變量等)
~/.bash_login
~/.profile

下面是幾個(gè)例子:
首先需要明確的是,讀取 ~/.bash_profile,該文件便會(huì)去讀取~/.bashrc,而~/.bashrc又會(huì)去讀取/etc/bashrc。所以只要讀取~/.bash_profile,便會(huì)同時(shí)讀取~/.bashrc/etc/bashrc。

  1. 圖形模式登錄時(shí),順序讀取:/etc/profile~/.profile。

  2. 圖形模式登錄后,打開終端時(shí),順序讀?。?code>~/.bashrc和/etc/bashrc

  3. 文本模式登錄時(shí),順序讀?。?code>/etc/profile,~/.bash_profile,~/.bashrc/etc/bashrc。

  4. 從其它用戶su到該用戶,則分兩種情況:

    (1)如果帶-l參數(shù)(或-參數(shù),--login參數(shù)),如:su -l username,則bash是lonin的,它將順序讀取以下配置文件:/etc/profile,~/.bash_profile,~/.bashrc/etc/bashrc

    (2)如果沒有帶-l參數(shù),則bash是non-login的,它將順序讀取:~/.bashrc/etc/bashrc并從父進(jìn)程繼承其環(huán)境變量。

  5. 注銷時(shí),或退出su登錄的用戶,如果是longin方式,那么bash會(huì)讀?。?code>~/.bash_logout

  6. 執(zhí)行自定義的shell文件時(shí),若使用“bash -l a.sh”的方式,則bash會(huì)讀取行:/etc/profile,~/.bash_profile,~/.bashrc/etc/bashrc,用sh -l a.sh調(diào)用bash,它將會(huì)執(zhí)行/etc/profile以及 ~/.profile。若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh,則不會(huì)讀取上面的任何文件,只能從其父進(jìn)程處繼承環(huán)境變量,像alias等就無法繼承使用了。

  7. 上面的例子凡是讀取到~/.bash_profile的,若該文件不存在,則讀取~/.bash_login,若前兩者不存在,讀取~/.profile。

參考:
https://blog.csdn.net/weixin_49539546/article/details/123536394
https://blog.csdn.net/qq_43516969/article/details/107726153?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&utm_relevant_index=1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容