寫在前面:不一樣的發行版裏面文件的命名可能有所不一樣,若有的發行版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
shell