日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

/etc/bashrc和/etc/profile傻傻分不清楚?

發(fā)布時(shí)間:2025/3/21 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 /etc/bashrc和/etc/profile傻傻分不清楚? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在一般的 linux 或者 unix 系統(tǒng)中, 都可以通過(guò)編輯 bashrc 和 profile來(lái)設(shè)置用戶的工作環(huán)境, 很多文章對(duì)于 profile 和 bashrc 也都有使用, 但究竟每個(gè)文件都有什么作用和該如何使用呢?

首先我們來(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(交互式) 模式.

Shell 的分類(lèi)

系統(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 和 non-interactive shell

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í)行

/etc/profile ~/.profile 在命令提示符狀態(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ū)別呢?

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.

bashrc

bashrc 也是看名字就知道, 是專(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í)行自身

普通 login shell /etc/profile=> /etc/bash.bashrc~/.profile=> ~/.bashrc => /etc/bashrc 終端種直接運(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.

最終修改

為了達(dá)到上述我們需要的執(zhí)行流程, 那必須對(duì)系統(tǒng)的 rc 文件做修改. 我們拿 Ubuntu 舉例
首先 我們編輯 /etc/profile 在文件頭部加入

export system_profile_loaded=1

這樣其他文件就可以根據(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, 我們需要在文件頭加入

[ -n "${system_bashrc_running}" ] && return system_bashrc_running=1 [ -z "${system_profile_loaded}" ] && source /etc/profile unset system_bashrc_running system_bashrc_runned=1

其中 system_bashrc_running 這樣的變量都是為了防止2次反復(fù)調(diào)用而加入的.
這樣系統(tǒng)級(jí)別的 rc 文件基本修改好了, 最好還可以再修改一下本地的rc文件, 所以我們編輯 “~/.profile”, 發(fā)現(xiàn)起內(nèi)容是

# ~/.profile: executed by Bourne-compatible login shells.if [ -n "$BASH" ]; thenif [ -f ~/.bashrc ]; then. ~/.bashrcfi fimesg n

而按照上述的修改規(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。