首先要弄明白什麼是交互式shell和非交互式shell,什麼是login shell 和non-login shell。 shell
交互式模式就是shell等待你的輸入,而且執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、簽退。當你簽退後,shell也終止了。bash
非交互式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,而且執行它們。當它讀到文件的結尾,shell也就終止了。ssh
login shell就是須要輸入用戶名及密碼登陸的shell,如開機shell登錄、ssh登錄、su - username(從root切換到其餘用戶時無需密碼)。繼承
non-login shell無需輸入密碼,如bash、su username、圖形界面打開bash。進程
/etc/profile:此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行並從/etc/profile.d目錄的配置文件中搜集shell的設置。登錄
/etc/bashrc:爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。變量
~/.bash_login:若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前二者不存在,讀取~/.profile。配置
~/.profile:若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前二者不存在,讀取~/.profile.另外,圖形模式登陸時,此文件將被讀取,即便存在~/.bash_profile和~/.bash_login。file
~/.bashrc:該文件包含專用於你的bash shell的bash信息,當登陸時以及每次打開新的shell時,該該文件被讀取。終端
下面是在本機的幾個例子:
首先須要明確的是,讀取~/.bash_profile,該文件便會去讀取~/.bashrc,而~/.bashrc又會去讀取/etc/bashrc。因此只要讀取~/.bash_profile,便會同時讀取~/.bashrc與/etc/bashrc。
1. 圖形模式登陸時,順序讀取:/etc/profile和~/.profile。
2. 圖形模式登陸後,打開終端時,順序讀取:~/.bashrc和/etc/bashrc。
3. 文本模式登陸時,順序讀取:/etc/profile,~/.bash_profile,~/.bashrc和/etc/bashrc。
4. 從其它用戶su到該用戶,則分兩種狀況:
(1)若是帶-l參數(或-參數,--login參數),如:su -l username,則bash是lonin的,它將順序讀取如下配置文件:/etc/profile,~/.bash_profile,~/.bashrc和/etc/bashrc。
(2)若是沒有帶-l參數,則bash是non-login的,它將順序讀取:~/.bashrc和/etc/bashrc並從父進程繼承其環境變量。
6. 執行自定義的shell文件時,若使用「bash -l a.sh」的方式,則bash會讀取行:/etc/profile,~/.bash_profile,~/.bashrc和/etc/bashrc,用sh -l a.sh調用bash,它將會執行/etc/profile以及 ~/.profile。若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh,則不會讀取上面的任何文件,只能從其父進程處繼承環境變量,像alias等就沒法繼承使用了。
7. 上面的例子凡是讀取到~/.bash_profile的,若該文件不存在,則讀取~/.bash_login,若前二者不存在,讀取~/.profile。