系統(tǒng)中的文件
在一般的 linux 或者 unix 系統(tǒng)中, 都可以通過(guò)編輯 bashrc 和 profile來(lái)設(shè)置用戶的工作環(huán)境, 很多文章對(duì)于 profile 和 bashrc 也都有使用, 但究竟每個(gè)文件都有什么作用和該如何使用呢?
首先看系統(tǒng)中的文件,一般的系統(tǒng)可能會(huì)有
/etc/profile
/etc/bashrc
~/.bashrc
~/.profile
而如果系統(tǒng)是Ubuntu或者debian的話想诅,就不會(huì)有/etc/bashrc而會(huì)有/etc/bash.bashrc文件嫌吠。
以上這些就是常用 profile 和 bashrc 文件了. 要理解這些文件之前還需要了解 Shell, Shell 的 login(登入) 和 interactive(交互式) 模式窖逗。
Shell的分類
系統(tǒng)的 shell 有很多種, 比如 bash, sh, zsh 之類的, 如果要查看某一個(gè)用戶使用的是什么 shell 可以通過(guò) finger [USERNAME] 命令來(lái)查看. 我們這里只說(shuō) shell 是 bash 的情況, 因?yàn)槿绻?sh 或者其他 shell 顯然不會(huì)運(yùn)行 bashrc 的。
1. login shell 和 no-login shell
“l(fā)ogin shell” 代表用戶登入, 比如使用 “su -“ 命令, 或者用 ssh 連接到某一個(gè)服務(wù)器上, 都會(huì)使用該用戶默認(rèn) shell 啟動(dòng) login shell 模式裁着。
該模式下的 shell 會(huì)去自動(dòng)執(zhí)行 /etc/profile 和 ~/.profile 文件, 但不會(huì)執(zhí)行任何的 bashrc 文件, 所以一般在/etc/profile 或者 ~/.profile 里我們會(huì)手動(dòng)去 source bashrc 文件。
而no-login shell得情況是我們?cè)?*終端下直接輸入bash或者bash -c "CMD" **來(lái)啟動(dòng)的shell。該模式下是不會(huì)去自動(dòng)運(yùn)行任何的profile文件玛歌。
2. interactive shell 和 non-interactiveshell
interactive shell 是交互式shell, 顧名思義就是用來(lái)和用戶交互的, 提供了命令提示符可以輸入命令.
該模式下會(huì)存在一個(gè)叫 PS1 的環(huán)境變量, 如果還不是 login shell 的則會(huì)去 source /etc/bash.bashrc 和 ~/.bashrc 文件
non-interactive shell 則一般是通過(guò) bash -c “CMD” 來(lái)執(zhí)行的bash.
該模式下不會(huì)執(zhí)行任何的 rc 文件, 不過(guò)還存在一種特殊情況這個(gè)我之后詳細(xì)講述
3. 在可能存在的模式組合中RC文件的執(zhí)行
SSH login, sudo su - [USER] 或者mac下開(kāi)啟終端
ssh 登入和 su - 是典型的 interactive login shell, 所以會(huì)有 PS1 變量, 并且會(huì)執(zhí)行
/etc/profile
~/.profile
4. 在命令提示符狀態(tài)下輸入bash或者ubuntu默認(rèn)設(shè)置下打開(kāi)終端
這樣開(kāi)啟的是 interactive no-login shell, 所以會(huì)有 PS1 變量, 只會(huì)執(zhí)行
/etc/bash.bashrc
~/.bashrc
通過(guò) bash -c “CMD” 或者 bash BASHFILE 命令執(zhí)行的 shell
這些命令什么都不會(huì)執(zhí)行, 也就是設(shè)置 PS1 變量, 不執(zhí)行任何 RC 文件
最特殊! 通過(guò) “ssh server CMD” 執(zhí)行的命令 或 通過(guò)程序執(zhí)行遠(yuǎn)程的命令
這是最特殊的一種模式, 理論上應(yīng)該既是 非交互 也是 非登入的, 但是實(shí)際上他不會(huì)設(shè)置 PS1, 但是還會(huì)執(zhí)行
/etc/bash.bashrc
bashrc
這里還有一點(diǎn)值得注意的是/etc/bashrc任何情況下都不會(huì)執(zhí)行。
bashrc和profile的區(qū)別
看了之前那么多種狀態(tài)組合, 最關(guān)鍵的問(wèn)題是, 究竟 bashrc 和 profile 有什么區(qū)別呢?
1. profile
其實(shí)看名字就能了解大概了, profile 是某個(gè)用戶唯一的用來(lái)設(shè)置環(huán)境變量的地方, 因?yàn)橛脩艨梢杂卸鄠€(gè) shell 比如 bash, sh, zsh 之類的, 但像環(huán)境變量這種其實(shí)只需要在統(tǒng)一的一個(gè)地方初始化就可以了, 而這就是 profile.
2. bashrc
bashrc 也是看名字就知道, 是專門用來(lái)給 bash 做初始化的比如用來(lái)初始化 bash 的設(shè)置, bash 的代碼補(bǔ)全, bash 的別名, bash 的顏色. 以此類推也就還會(huì)有 shrc, zshrc 這樣的文件存在了, 只是 bash 太常用了而已.
期望的執(zhí)行順序
=> 代表 在文件內(nèi)部 source, 換行的 => 代表自身執(zhí)行結(jié)束以后在 source, 同一行表示先 source 在執(zhí)行自身
1. 普通Login shell
/etc/profile
=> /etc/bash.bashrc
~/.profile
=> ~/.bashrc => /etc/bashrc
2. 終端中直接運(yùn)行bash
/etc/bash.bashrc
~/.bashrc => /etc/bashrc
bash -c “CMD”
什么都不執(zhí)行
ssh server “CMD”
/etc/bash.bashrc => /etc/profile
~/.bashrc => | /etc/bashrc => /etc/profile
| ~/.profile
這里會(huì)有點(diǎn)小混亂, 因?yàn)榧扔?/etc/bash.bashrc 又有 /etc/bashrc, 其實(shí)是這樣的: ubuntu 和 debian 有 /etc/bash.bashrc 文件但是沒(méi)有 /etc/bashrc, 其他的系統(tǒng)基本都是只有 /etc/bashrc 沒(méi)有 /etc/bash.bashrc.
Shell 生效過(guò)程
參考鏈接
/etc/bashrc和/etc/profile傻傻分不清楚擎椰?
關(guān)于Linux環(huán)境變量的問(wèn)題支子,~/.bashrc的環(huán)境變量為什么交互式登錄shell方式依然會(huì)生效? - 伍亦勤的回答 - 知乎
https://www.zhihu.com/question/67348151/answer/851156600