什麼是交互式shell和非交互式shell,什麼是login shell 和non-login shell。 html
交互式模式:就是shell等待你的輸入,而且執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、簽退。當你簽退後,shell也終止了。shell
非交互式模式:在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,而且執行它們。當它讀到文件的結尾,shell也就終止了。bash
login shell:就是須要輸入用戶名及密碼登陸的shell,如開機shell登錄、ssh登錄、su - username(從root切換到其餘用戶時無需密碼)。ssh
non-login shell:無需輸入密碼,如bash、su username、圖形界面打開bash。spa
bashrc用於交互式non-login shell,而profile用於交互式login shell。系統中存在許多bashrc和profile文件 htm
交互式登陸(login)模式:主要用來設置一些系統變量blog
/etc/profile:(針對全部用戶)此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行並從/etc/profile.d目錄的配置文件中搜集shell的設置。繼承
~/.profile:(針對我的)若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前二者不存在,讀取~/.profile.另外,圖形模式登陸時,此文件將被讀取,即便存在~/.bash_profile和~/.bash_login。進程
~/.bash_profile:每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次!默認狀況下,他設置一些環境變量,執行用戶的.bashrc文件。 get
~/.bash_login:若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前二者不存在,讀取~/.profile。
交互式非登陸(non login)模式:主要用來保存一些bash的設置
/etc/bashrc:爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。
~/.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。