什么是shell
我們使用很多的linux命令來控制操作系統(tǒng)狈醉,然而操作系統(tǒng)是沒有辦法直接識(shí)別這些命令的衣陶,需要一個(gè)程序把這些命令轉(zhuǎn)化為機(jī)器碼(打個(gè)比方)镀迂,這個(gè)程序就是shell恭垦。也就是說我們通過shell和操作系統(tǒng)進(jìn)行交流文兢。
這樣的shell程序有好幾種可以通過cat /etc/shells 來查看
在大多數(shù)的linux系統(tǒng)中都把bash 作為默認(rèn)的系統(tǒng)默認(rèn)的shell程序
當(dāng)然我們可以使用chsh 命令來修改操作系統(tǒng)使用的shell
chsh -s /bin/csh
bash
Bash Shell 建立于 UNIX 和 Linux? 之上邻吭,并且 Bash Shell 通常是新的系統(tǒng)和用戶的缺省 Shell
Bash的幾種模式
交互式
顧名思義餐弱,這種shell中的命令時(shí)由用戶從鍵盤交互式地輸入的,運(yùn)行的結(jié)果也能夠輸出到終端顯示給用戶看囱晴。非交互式
這種shell可能由某些自動(dòng)化過程啟動(dòng)膏蚓,不能直接從請(qǐng)求用戶的輸入,也不能直接輸出結(jié)果給終端用戶看畸写。輸出最好寫到文件驮瞧。比如啟動(dòng)tomcat的startup.sh就是非交互式的登錄的
意思是這種是在某用戶由/bin/login登陸進(jìn)系統(tǒng)后啟動(dòng)的shell,跟這個(gè)用戶綁定枯芬。這個(gè)shell是用戶登陸后啟動(dòng)的第一個(gè)進(jìn)程论笔。login進(jìn)程在啟動(dòng)shell時(shí)傳遞第0個(gè)參數(shù)指明shell的名字采郎,該參數(shù)第一個(gè)字符為"-",指明這是一個(gè)login shell狂魔。非登錄的
不需login而由某些程序啟動(dòng)的shell蒜埋。比如直接執(zhí)行/bin/bash。使用su zhouyang 切換用戶最楷,這樣啟動(dòng)的都是非登錄的shell
區(qū)分bash是登錄模式還是非登錄模式的方法整份,輸入 echo $0,如果輸出的字符前面帶有-籽孙,表示的登錄模式的烈评,否則是非登錄模式。
Bash的啟動(dòng)腳本
之所以先說Bash的幾種模式犯建,是因?yàn)樵诓煌牡卿浤J较陆补冢珺ash啟動(dòng)腳本的順序和類型也是不同的
登錄模式
當(dāng)bash以login shell啟動(dòng)時(shí),它會(huì)執(zhí)行/etc/profile中的命令胎挎,
然后/etc/profile調(diào)用/etc/profile.d目錄下的所有腳本;
然后執(zhí)行~/.bash_profile或者~/.bash_login或者~/.profile中的一個(gè)忆家,
他們的執(zhí)行優(yōu)先級(jí)為bash_profile>bash_login>profile
然后~/.bash_profile調(diào)用~/.bashrc犹菇,
最后~/.bashrc又調(diào)用/etc/bashrc。
當(dāng)退出登錄模式下的shell的時(shí)候會(huì)執(zhí)行~/.bash_logout
非登錄模式
如果 登錄 Shell芽卿,那么 Bash 將嘗試讀取 ~/.bashrc揭芍。并不執(zhí)行其他的文件。如果 Bash Shell 是非交互的卸例,那么它將擴(kuò)展 BASH_ENV 環(huán)境變量的值称杨,就是說這個(gè)變量中有哪些文件,他就執(zhí)行哪些筷转,可以通過 echo $BASH_ENV來查看變量的值姑原。
當(dāng)以非login方式啟動(dòng)時(shí),它會(huì)調(diào)用~/.bashrc呜舒,
隨后~/.bashrc中調(diào)用/etc/bashrc锭汛,
最后/etc/bashrc調(diào)用所有/etc/profile.d目錄下的腳本。
所以bash啟動(dòng)文件的執(zhí)行順序只和登錄和非登錄有關(guān)袭蝗,和交互與非交互并沒有多大關(guān)系
登錄交互 | 登錄非交互 | 非登錄交互 | 非登錄非交互 |
---|---|---|---|
ssh登錄 | ssh登錄后執(zhí)行一個(gè)*.sh | 使用su zhouyang唤殴,切換用戶 | 使用su zhouyang 切換用戶之后,執(zhí)行*.sh |
文件解釋
/etc/profile: 此文件為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí),該文件被執(zhí)行. 并從/etc/profile.d目錄的配置文件中搜集shell的設(shè)置到腥。
/etc/bashrc: 通過.bashrc調(diào)用執(zhí)行這個(gè)文件.當(dāng)bash shell被打開時(shí),該文件被讀榷涫拧(即每次新開一個(gè)終端,都會(huì)執(zhí)行bashrc)乡范。
~/.bash_profile: 每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次配名。默認(rèn)情況下,設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件啤咽。
~/.bashrc: 該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開新的shell時(shí),該該文件被讀取。
~/.bash_logout: 當(dāng)在登錄模式下logout(退出bash shell)時(shí),執(zhí)行該文件. 另外,/etc/profile中設(shè)定的變量(全局)的可以作用于任何用戶,而~/.bashrc等中設(shè)定的變量(局部)只能繼承 /etc/profile中的變量,他們是"父子"關(guān)系段誊。
~/.bash_profile: 是交互式闰蚕、login 方式進(jìn)入 bash 運(yùn)行的~/.bashrc 是交互式 non-login 方式進(jìn)入 bash 運(yùn)行的通常二者設(shè)置大致相同,所以通常前者會(huì)調(diào)用后者连舍。