1. 程式人生 > >/etc/bashrc和/etc/profile傻傻分不清楚?

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


導讀 在一般的 linux 或者 unix 系統中, 都可以通過編輯 bashrc 和 profile來設定使用者的工作環境, 很多文章對於 profile 和 bashrc 也都有使用, 但究竟每個檔案都有什麼作用和該如何使用呢?

首先我們來看系統中的這些檔案, 一般的系統可能會有

/etc/profile
/etc/bashrc

~/.bashrc
~/.profile

而如果系統是 ubuntu 或者 debian 的話, 就不會有 /etc/bashrc 而會有 /etc/bash.bashrc 檔案.
以上這些就是常用 profile 和 bashrc 檔案了. 要理解這些檔案之前還需要了解 Shell, Shell 的 login(登入) 和 interactive(互動式) 模式.

Shell 的分類

系統的 shell 有很多種, 比如 bash, sh, zsh 之類的, 如果要檢視某一個使用者使用的是什麼 shell 可以通過 finger [USERNAME] 命令來檢視. 我們這裡只說 shell 是 bash 的情況, 因為如果是 sh 或者其他 shell 顯然不會執行 bashrc 的.

login shell 和 no-login shell

“login shell” 代表使用者登入, 比如使用 “su -“ 命令, 或者用 ssh 連線到某一個伺服器上, 都會使用該使用者預設 shell 啟動 login shell 模式.
該模式下的 shell 會去自動執行 /etc/profile 和 ~/.profile 檔案, 但不會執行任何的 bashrc 檔案, 所以一般再 /etc/profile 或者 ~/.profile 裡我們會手動去 source bashrc 檔案.
而 no-login shell 的情況是我們在終端下直接輸入 bash 或者 bash -c “CMD” 來啟動的 shell.
該模式下是不會自動去執行任何的 profile 檔案.

interactive shell 和 non-interactive shell

interactive shell 是互動式shell, 顧名思義就是用來和使用者互動的, 提供了命令提示符可以輸入命令.
該模式下會存在一個叫 PS1 的環境變數, 如果還不是 login shell 的則會去 source /etc/bash.bashrc 和 ~/.bashrc 檔案
non-interactive shell 則一般是通過 bash -c “CMD” 來執行的bash.

該模式下不會執行任何的 rc 檔案, 不過還存在一種特殊情況這個我之後詳細講述

在可能存在的模式組合中 RC 檔案的執行

SSH login, sudo su - [USER] 或者 mac 下開啟終端
ssh 登入和 su - 是典型的 interactive login shell, 所以會有 PS1 變數, 並且會執行

/etc/profile
~/.profile
在命令提示符狀態下輸入 bash 或者 ubuntu 預設設定下開啟終端

這樣開啟的是 interactive no-login shell, 所以會有 PS1 變數, 只會執行

/etc/bash.bashrc
~/.bashrc

通過 bash -c “CMD” 或者 bash BASHFILE 命令執行的 shell

這些命令什麼都不會執行, 也就是設定 PS1 變數, 不執行任何 RC 檔案
最特殊! 通過 “ssh server CMD” 執行的命令 或 通過程式執行遠端的命令

這是最特殊的一種模式, 理論上應該既是 非互動 也是 非登入的, 但是實際上他不會設定 PS1, 但是還會執行

/etc/bash.bashrc
bashrc

這裡還有一點值得注意的是 /etc/bashrc 任何情況下都不會執行.

bashrc 和 profile 的區別

看了之前那麼多種狀態組合, 最關鍵的問題是, 究竟 bashrc 和 profile 有什麼區別呢?

profile

其實看名字就能瞭解大概了, profile 是某個使用者唯一的用來設定環境變數的地方, 因為使用者可以有多個 shell 比如 bash, sh, zsh 之類的, 但像環境變數這種其實只需要在統一的一個地方初始化就可以了, 而這就是 profile.

bashrc

bashrc 也是看名字就知道, 是專門用來給 bash 做初始化的比如用來初始化 bash 的設定, bash 的程式碼補全, bash 的別名, bash 的顏色. 以此類推也就還會有 shrc, zshrc 這樣的檔案存在了, 只是 bash 太常用了而已.
期望的執行順序
=> 代表 在檔案內部 source, 換行的 => 代表自身執行結束以後在 source, 同一行表示先 source 在執行自身

普通 login shell
/etc/profile
   => /etc/bash.bashrc

~/.profile
  => ~/.bashrc => /etc/bashrc
終端種直接執行 bash
/etc/bash.bashrc
~/.bashrc => /etc/bashrc
bash -c “CMD”
什麼都不執行
ssh server “CMD”
/etc/bash.bashrc => /etc/profile
~/.bashrc => | /etc/bashrc => /etc/profile
             | ~/.profile

這裡會有點小混亂, 因為既有 /etc/bash.bashrc 又有 /etc/bashrc, 其實是這樣的 ubuntu 和 debian 有 /etc/bash.bashrc 檔案但是沒有 /etc/bashrc, 其他的系統基本都是隻有 /etc/bashrc 沒有 /etc/bash.bashrc.

最終修改

為了達到上述我們需要的執行流程, 那必須對系統的 rc 檔案做修改. 我們拿 Ubuntu 舉例
首先 我們編輯 /etc/profile 在檔案頭部加入

export system_profile_loaded=1

這樣其他檔案就可以根據 $system_profile_loaded 來判斷是否已經載入過 profile, 接著我們可以看到

  unset i
fi

if [ "$PS1" ]; then
  if [ "$BASH" ]; then
    PS1='\[email protected]\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

umask 022

按照我們剛才的方案, 應該是不管任何情況都應該在檔案末尾去載入 bashrc, 所以我們修改成

  unset i
fi

umask 022

if [ "$BASH" ]; then
  if [ "$PS1" ]; then
    PS1='\[email protected]\h:\w\$ '
  fi

  if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
  fi
else
  if [ "`id -u`" -eq 0 ]; then
    PS1='# '
  else
    PS1='$ '
  fi
fi

當然也可以有其他該法,只要符合在檔案末尾載入 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次反覆呼叫而加入的.
這樣系統級別的 rc 檔案基本修改好了, 最好還可以再修改一下本地的rc檔案, 所以我們編輯 “~/.profile”, 發現起內容是

# ~/.profile: executed by Bourne-compatible login shells.

if [ -n "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n

而按照上述的修改規則只需要替換成

export local_profile_loaded=1

if [ -n "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
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

用來防止反覆載入 profile, 並且這裡需要特殊註明的是

[ -r /etc/bashrc -a -z "${system_bashrc_runned}" ] && source /etc/bashrc

/etc/bashrc 這個檔案只有在 mac 之類的系統下才有, 所以 ubuntu 這裡這行可以不加, 不過有判斷是否存在所以加了也沒關係.
到這裡基本上就可以比較完美的解決不通的 shell 載入順序問題了, 當然比如這個使用者用的是 zsh 之類的也需要按照型別的原理來修改.
另外, 在使用者目錄下 可能會存在 ~/.bash_profile, ~/.bash_login 這樣的檔案, 但如果有這些檔案 bash 就不會去載入 ~/.profile 了, 所以如果存在的話需要刪除 這些檔案並把內容合併進 ~/.profile 和 ~/.bashrc 才行.

相關推薦

/etc/bashrc/etc/profile清楚

導讀 在一般的 linux 或者 unix 系統中, 都可以通過編輯 bashrc 和 profile來設定使用者的工作環境, 很多文章對於 profile 和 bashrc 也都有使用, 但究竟每個檔案都有什麼作用和該如何使用呢? 首先我們來看系統中的這些檔案, 一般的

Linux下文件 ~/.bashrc ~/.bash_profile /etc/bashrc /etc/profile 的區別 | 用戶登錄後加載配置文件的順序

用戶登錄 details 文件中 設定 tail 配置文件 https 說明 終端 轉自 https://blog.csdn.net/secondjanuary/article/details/9206151 文件說明: /ect/profile 此文件為系統的每個用

Appium+python自動化(三十三)- 測試環境本地環境清楚-Remote(超詳解)

  簡介   在前邊所有涉及啟動app的時候有這樣一行程式碼driver = webdriver.Remote('http://

CSS3 清楚的transition, transform animation

dem css3 狀態 mar 屬性 全部 正數 nta ram transition     transition允許css的屬性值在一定的時間區間內平滑地過渡,語法如下: transition : transition-property transition-

VerificationValidation清楚

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6339384.html Verification:相比Validation,確認產品功能、服務或系統是否符合規則、要求、規範和強制條件,通常是還沒有面向客戶的內部過程,看有沒有“把事情做對”。 Va

finalizefinally清楚

一. finalize 用途 答: 垃圾回收器(garbage colector)決定回收某物件時, 就會執行該物件的 finalize()方法 但是在 Java 中很不幸, 如果記憶體總是充足的, 那麼垃圾回收可能永遠不會進行, 也就是說 filalize()可能永遠不被執行, 顯然指望它

/etc/bashrc 使用者目錄下.bashrc的區別

/etc/bashrc,使用者目錄下.bashrc有什麼區別? 一個是針對整個系統所有使用者的,一個是針對特定使用者的./etc/bashrc修改了以後要重啟系統才生效,而使用者目錄下.bashrc修改了以後重新登入就生效 2。/etc/profile與/etc

nor flash nand flash 清楚

nor flash和nand flash區別 學習嵌入式有一段時間了,剛接觸nor和nand時很是迷惑,非要逼我寫一篇部落格才能記清楚。 首先他們都是儲存裝置,統稱叫做flash memory,導致他們存在差異的原因肯定是硬體上的差異了。//好似男人和女人,先有硬體的不同

依賴倒置、依賴注入控制反轉清楚

## 依賴倒置 啥是依賴倒置?依賴倒置是SOLID原則之一,詞的字面意思就是將依賴關係的倒置。 其實依賴倒置大家早就會了,這個實際上就是面向介面程式設計。舉個例子,現在電子產品更新換代快,可能沒過多久咱們就想換一臺電腦玩玩。即使電腦的品牌不同,但我們還是可以正常使用,總不會換個牌子就不會用了吧。 所以如

終於不再對transitionanimation,清楚了 --vue中使用transitionanimation

以前寫頁面注重在功能上,對於transition和animation是隻聞其聲,不見其人,對於頁面動畫效果心理一直癢癢的。最近做活動頁面,要求頁面比較酷炫,終於有機會認真瞭解了。 transition:英文過渡的意思,作用是過渡效果;animation:英文活潑、生氣、激勵,動畫片就是animation fi

x86CPU 實模式 保護模式 清楚? 基於Xv6-OS 分析CR0 寄存器

獲取 ack oot pop -o sdn 行程 model 保護 基於Xv6-OS 分析CR0 寄存器 之前一直認為暈乎乎的...啥?什麽時候切換real model,怎麽切換,為什麽要切換? -----------------------------------

Linux中/etc/passwd /etc/shadows 詳解

賬號 nologin var game tcs 發布 文件中 用戶組 8K linux操作系統上的用戶如果需要登錄主機,當其輸入用戶名和密碼之後: 首先在/etc/passwd文件中查找是否有你的賬號,如果沒有無法登錄,如果有的話將該用戶的UID和GID讀出來,此外將此用

菜鳥學Linux之:用戶賬戶管理下的/etc/passwd/etc/shadow

Linux、/etc/passwd用戶賬戶管理主要有如下幾個配置文件:/etc/passwd、/etc/shadow、/etc/group和用戶郵箱/var/spool/mail,今天著重要說明一下/etc/passwd和/etc/shadow兩個配置文件/etc/passwd:記錄了Linux系統上所有的帳

/etc/passwd/etc/group文件詳解

color 超級用戶 sbin list UC mon usb use 表示 用戶管理 想要知道, 系統中有哪些用戶, 可以查看這個文件: /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sb

/etc/fstab/etc/mtab的區別

命令的使用 文件中 每次 str mce 配置 命令 tro sta 1./etc/fstab /etc/fstab是開機自動掛載的配置文件,在開機時起作用。相當於啟動linux的時候,自動使用檢查分區的fsck命令和掛載分區的mount命令,檢查分區和掛載分區都是根據/e

認識/etc/passwd/etc/shadow

oot LG bash 算法 pass /bin/bash 用戶名 AD 限制 認識/etc/passwd和/etc/shadow============================== /etc/passwd[root@aminglinux ~]# head -n

linux關於用戶組的幾個配置文件—/etc/passwd、/etc/shadow、/etc/group/etc/gshadow

分隔 間隔 oem 配置文件 目錄 msg 密碼 login oldboy 1./etc/passwd存儲用戶信息 [root@oldboy ~]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bi

/etc/psswd/etc/shadow檔案內容解讀

/etc/passwd 系統中所有使用者的資訊 /etc/shadow 系統中密碼資訊存放位置 檔案的節點數 inode 和 子目錄個數  drwx------. 4 allen(所屬者) allen(所屬組)    

CIR,CBS,EBS,PIR,PBS清楚?看這裏!--zz

進入 只有一個 車輛 20M 關鍵參數 郵件 兩個 com 技術分享 https://www.cnblogs.com/foonsun/p/5687978.html 單速單桶 假設有一套自動出卡系統,包括一臺自動出卡機和一個盒子C。自動出卡機以固定的速率(3.6秒出一張通行卡

同步 非同步 阻塞 非阻塞,清楚

前言 大家做socket程式設計時,經常會遇到同步 非同步 阻塞 非阻塞這種術語,很混亂,大家的解釋也是千奇百怪,下面就說下我的理解。 應該把它們拆分開來,同步與非同步是一個維度,阻塞與非阻塞是一個維度。 從資料通訊角度考慮 判斷是阻塞還是非阻塞,主要是看函式沒有資料接收