/etc/bashrc和/etc/profile傻傻分不清楚?
首先我們來(lái)看系統(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(交互式) 模式.
系統(tǒng)的 shell 有很多種, 比如 bash, sh, zsh 之類(lèi)的, 如果要查看某一個(gè)用戶使用的是什么 shell 可以通過(guò) finger [USERNAME] 命令來(lái)查看. 我們這里只說(shuō) shell 是 bash 的情況, 因?yàn)槿绻?sh 或者其他 shell 顯然不會(huì)運(yùn)行 bashrc 的.
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è)诮K端下直接輸入 bash 或者 bash -c “CMD” 來(lái)啟動(dòng)的 shell.
該模式下是不會(huì)自動(dòng)去運(yùn)行任何的 profile 文件.
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ì)講述
在可能存在的模式組合中 RC 文件的執(zhí)行SSH login, sudo su - [USER] 或者 mac 下開(kāi)啟終端
ssh 登入和 su - 是典型的 interactive login shell, 所以會(huì)有 PS1 變量, 并且會(huì)執(zhí)行
這樣開(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ū)別呢?
profile其實(shí)看名字就能了解大概了, profile 是某個(gè)用戶唯一的用來(lái)設(shè)置環(huán)境變量的地方, 因?yàn)橛脩艨梢杂卸鄠€(gè) shell 比如 bash, sh, zsh 之類(lèi)的, 但像環(huán)境變量這種其實(shí)只需要在統(tǒng)一的一個(gè)地方初始化就可以了, 而這就是 profile.
bashrcbashrc 也是看名字就知道, 是專(zhuān)門(mén)用來(lái)給 bash 做初始化的比如用來(lái)初始化 bash 的設(shè)置, bash 的代碼補(bǔ)全, bash 的別名, bash 的顏色. 以此類(lèi)推也就還會(huì)有 shrc, zshrc 這樣的文件存在了, 只是 bash 太常用了而已.
期望的執(zhí)行順序
=> 代表 在文件內(nèi)部 source, 換行的 => 代表自身執(zhí)行結(jié)束以后在 source, 同一行表示先 source 在執(zhí)行自身
這里會(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.
最終修改為了達(dá)到上述我們需要的執(zhí)行流程, 那必須對(duì)系統(tǒng)的 rc 文件做修改. 我們拿 Ubuntu 舉例
首先 我們編輯 /etc/profile 在文件頭部加入
這樣其他文件就可以根據(jù) $system_profile_loaded 來(lái)判斷是否已經(jīng)載入過(guò) profile, 接著我們可以看到
unset i fiif [ "$PS1" ]; thenif [ "$BASH" ]; thenPS1='\u@\h:\w\$ 'if [ -f /etc/bash.bashrc ]; then. /etc/bash.bashrcfielseif [ "`id -u`" -eq 0 ]; thenPS1='# 'elsePS1='$ 'fifi fiumask 022按照我們剛才的方案, 應(yīng)該是不管任何情況都應(yīng)該在文件末尾去載入 bashrc, 所以我們修改成
unset i fiumask 022if [ "$BASH" ]; thenif [ "$PS1" ]; thenPS1='\u@\h:\w\$ 'fiif [ -f /etc/bash.bashrc ]; then. /etc/bash.bashrcfi elseif [ "`id -u`" -eq 0 ]; thenPS1='# 'elsePS1='$ 'fi fi當(dāng)然也可以有其他該法,只要符合在文件末尾載入 bashrc 就可以了.
接著我們修改 /etc/bash.bashrc, 我們需要在文件頭加入
其中 system_bashrc_running 這樣的變量都是為了防止2次反復(fù)調(diào)用而加入的.
這樣系統(tǒng)級(jí)別的 rc 文件基本修改好了, 最好還可以再修改一下本地的rc文件, 所以我們編輯 “~/.profile”, 發(fā)現(xiàn)起內(nèi)容是
而按照上述的修改規(guī)則只需要替換成
export local_profile_loaded=1if [ -n "$BASH" ]; thenif [ -f ~/.bashrc ]; then. ~/.bashrcfi fi這樣就始終再載入完 profile 以后去載入 bashrc 了, 接著我們像編輯 /etc/bash.bashrc 一樣的去修改 ~/.bashrc, 文件頭上加入
[ -n "${local_bashrc_running}" ] && return local_bashrc_running=1 [ -r /etc/bashrc -a -z "${system_bashrc_runned}" ] && source /etc/bashrc [ -r ~/.profile -a -z "${local_profile_loaded}" ] && source ~/.profile unset local_bashrc_running用來(lái)防止反復(fù)加載 profile, 并且這里需要特殊注明的是
[ -r /etc/bashrc -a -z "${system_bashrc_runned}" ] && source /etc/bashrc/etc/bashrc 這個(gè)文件只有在 mac 之類(lèi)的系統(tǒng)下才有, 所以 ubuntu 這里這行可以不加, 不過(guò)有判斷是否存在所以加了也沒(méi)關(guān)系.
到這里基本上就可以比較完美的解決不通的 shell 加載順序問(wèn)題了, 當(dāng)然比如這個(gè)用戶用的是 zsh 之類(lèi)的也需要按照類(lèi)型的原理來(lái)修改.
另外, 在用戶目錄下 可能會(huì)存在 ~/.bash_profile, ~/.bash_login 這樣的文件, 但如果有這些文件 bash 就不會(huì)去載入 ~/.profile 了, 所以如果存在的話需要?jiǎng)h除 這些文件并把內(nèi)容合并進(jìn) ~/.profile 和 ~/.bashrc 才行.
本文原創(chuàng)地址:http://www.linuxprobe.com/diff-bashrcprofile.html
免費(fèi)提供最新Linux技術(shù)教程書(shū)籍,為開(kāi)源技術(shù)愛(ài)好者努力做得更多更好:http://www.linuxprobe.com/thread
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的/etc/bashrc和/etc/profile傻傻分不清楚?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下/etc目录详解
- 下一篇: source, ~/.bashrc, ~