寫在前面:不同的發行版里面文件的命名可能有所不同,如有的發行版etc目錄下有bashrc,有的發行版下面是bash.bashrc。這個根據每個人不同的發行版注意下具體的文件名稱。
/etc/profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.並從/etc/profile.d目錄的配置文件中搜集shell的設置.所以如果你有對/etc/profile有修改的話必須得重啟你的修改才會生效,此修改對每個用戶都生效。可以通過命令source /etc/profile立即生效
/etc/bashrc或/etc/bash.bashrc:為每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.如果你想對所有的使用bash的用戶修改某個配置並在以后打開的bash都生效的話可以修改這個文件,修改這個文件不用重啟,重新打開一個bash即可生效。
~/.bash_profile或~/.profile :每個用戶都可使用該文件輸入專用於當前用戶使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件.
此文件類似於/etc/profile,也是需要需要重啟才會生效,/etc/profile對所有用戶生效,~/.bash_profile只對當前用戶生效。
~/.bashrc:該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該文件被讀取.(每個用戶都有一個.bashrc文件,在用戶目錄下)。此文件類似於/etc/bashrc或/etc/bash.bashrc,不需要重啟生效,重新打開一個bash即可生效, /etc/bashrc或/etc/bash.bashrc對所有用戶新打開的bash都生效,但~/.bashrc只對當前用戶新打開的bash生效。
另外,/etc/profile中設定的變量(全局)的可以作用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是"父子"關系.
要搞清bashrc與profile的區別,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell。
交互式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作交互式是因為shell與用戶進行交互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、簽退。當你簽退后,shell也終止了。 shell也可以運行在另外一種模式:非交互式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾,shell也就終止了。
bashrc與profile都用於保存用戶的環境信息,bashrc用於交互式non-loginshell,而profile用於交互式login shell。
交互式的:顧名思義,這種shell中的命令時由用戶從鍵盤交互式地輸入的,運行的結果也能夠輸出到終端顯示給用戶看。例如我們平常在終端輸入的cd命令、vi命令、mv等都屬於交互式的。
非交互式的:這種shell可能由某些自動化過程啟動,不能直接從請求用戶的輸入,也不能直接輸出結果給終端用戶看。通常我們寫的shell腳本都是非交互式的,通過sh 直接運行該腳本文件。
login的:意思是這種是在某用戶由/bin/login登陸進系統后啟動的shell,跟這個用戶綁定。這個shell是用戶登陸后啟動的第一個進程。login進程在啟動shell時傳遞第0個參數指明shell的名字,該參數第一個字符為"-",指明這是一個login shell。比如對bash而言,啟動參數為"-bash"。當bash以login shell啟動時,它會執行/etc/profile中的命令,然后/etc/profile調用/etc/profile.d目錄下的所有腳本;然后執行~/.profile,~/.profile調用~/.bashrc,最后~/.bashrc又調用/etc/bash.bashrc。
要識別一個shell是否為login shell,只需在該shell下執行echo $0:
# echo $0
如果輸出為該shell名字,加上一個'-'前綴,則說明該shell為login shell。例如-bash,-su等等。實驗一下,在本人的Ubuntu系統下,打開Terminal,輸入echo $0,得到的是"bash",說明這不是一個login shell。而切換到root用戶下,執行同樣命令,得到了"-su"的結果,說明由su登錄的為login shell。
非login的:不需login而由某些程序啟動的shell。傳遞給shell的參數,是沒有'-'前綴的。還以Bash為例,當以非login方式啟動時,它會調用~/.bashrc,隨后~/.bashrc中調用/etc/bashrc,最后/etc/bashrc調用所有/etc/profile.d目錄下的腳本。這個有興趣的可以打開這些文件看一看。非login的shell主要包括以"#su","#su USERNAME"啟動的shell,和圖形終端(例如Ubuntu的Terminal),執行的腳本等等。識別非login的shell方法還是執行#echo $0命令,得到的結果如果沒有'-'前綴,即為非login的。
參考:https://blog.csdn.net/wang_xijue/article/details/46820043