交互式shell和非交互式shell、登陸shell和非登陸shell的區別

轉自交互式shell和非交互式shell、登陸shell和非登陸shell的區別linux


交互式shell和非交互式shell、登陸shell和非登陸shell的區別。
首先,這是兩個不一樣的維度來劃分的,一個是是否交互式,另外一個是是否登陸。shell

交互式shell和非交互式shell(interactive shell and non-interactive shell)
交互式模式就是在終端上執行,shell等待你的輸入,而且當即執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、退出。當你退出後,shell也終止了。
shell也能夠運行在另一種模式:非交互式模式,以shell script(非交互)方式執行。在這種模式 下,shell不與你進行交互,而是讀取存放在文件中的命令,而且執行它們。當它讀到文件的結尾EOF,shell也就終止了。
能夠經過打印「$-」變量的值(表明着當前shell的選項標誌),查看其中的「i」選項(表示interactive shell)來區分交互式與非交互式shell。bash

1
2
3
4
5
master@jay-intel:~/workspace/shell$ echo $-
himBH
master@jay-intel:~/workspace/shell$ ./test.sh
echo $-
hB


登陸shell和非登陸shell
登陸shell:是須要用戶名、密碼登陸後才能進入的shell(或者經過」–login」選項生成的shell)。
非登陸shell:固然就不須要輸入用戶名和密碼便可打開的Shell,例如:直接命令「bash」就是打開一個新的非登陸shell,在Gnome或KDE中打開一個「終端」(terminal)窗口程序也是一個非登陸shell。
執行exit命令,退出一個shell(登陸或非登陸shell);
執行logout命令,退出登陸shell(不能退出非登陸shell)。
spa

1
2
3
4
5
6
7
8
9
10
11
master@jay-intel:~$ bash --login
master@jay-intel:~$ logout
master@jay-intel:~$ bash --login
master@jay-intel:~$ exit
logout
 
master@jay-intel:~$ bash
master@jay-intel:~$ logout
bash: logout: not login shell: use `exit'
master@jay-intel:~$ exit
exit

bash是 login shell 時,其進程名爲」-bash「 而不是」bash」。 好比下面的命令行演示:
man bash: A login shell is one whose first character of argument zero is a -, or one started with the –login option.命令行

1
2
3
4
5
6
7
8
9
10
11
12
# 在 login shell 中:
[perf@host_220-188 ~]$ echo $0
-bash
[perf@host_220-188 ~]$ ps -ef | grep '\-bash' | grep -v grep
root     16823 16821  0 May06 pts/0    00:00:00 -bash
perf     21135 21134  0 May07 pts/1    00:00:00 -bash
 
#在一個非登錄shell中:
jay@jay-linux:~$ echo $0
/bin/bash
jay@jay-linux:~$ ps -ef | grep '\-bash' | grep -v grep
jay@jay-linux:~$

總結一下曾經看在chinaunix論壇中看到的關於登陸shell與非登陸shell、交互式shell與非交互式shell的討論:
Login Shell:當init3時,mingetty spawn出登陸提示符的時候,你輸入賬號和密碼進入了,出現了shell提示符,這個過程就是登陸shell;
Interactive Shell:接下來你獲得了一個像「root@host />」這樣的提示符,你輸入什麼,它就解釋出什麼,這就是交互式shell;你在當前shell又fork了一個 shell(bash),這個bash也是交互式shell。一般狀況下interactive shell是login shell派生出來的。
Non Interactive Shell:你須要寫一個bash script,用外部shell執行「bash script.sh」命令,它(bash)從能夠第一條命令執行到最後一條而後退出,不與你進行任何交互,它就是非交互式shell。
交互式非登陸shell,例如你在Gnome圖形界面中打開「終端」出來的那種窗口程序,和登陸shell相比,它是「非登陸」的,你並不須要輸入用戶名和密碼,和非交互式shell相比,這是「交互式」的,就像你說的那它「你輸入什麼,它就解釋什麼」。unix

對於Bash來講,登陸shell(包括交互式登陸shell和使用「–login」選項的非交互shell),它會首先讀取和執行/etc/profile全局配置文件中的命令,而後依次查找~/.bash_profile、~/.bash_login 和 ~/.profile這三個配置文件,讀取和執行這三個中的第一個存在且可讀的文件中命令。除非被「–noprofile」選項禁止了。
在非登陸shell裏,只讀取 ~/.bashrc (和 /etc/bash.bashrc、/etc/bashrc )文件,不一樣的發行版裏面可能有所不一樣,如RHEL6.3中非登陸shell僅執行了「~/.bashrc」文件(沒有執行/etc/bashrc),而KUbuntu10.04中卻依次執行了/etc/bash.bashrc 和 ~/.bashrc 文件。
對於這些規則,能夠直接在相應的配置文件中加一些echo命令來驗證其真實性。code

參考資料:man bash (搜索interactive、login等關鍵)orm

相關文章
相關標籤/搜索