1. 程式人生 > >深入淺出理解互動式shell和非互動式shell、登入shell和非登入shell的區別

深入淺出理解互動式shell和非互動式shell、登入shell和非登入shell的區別

首先我們需要把bash理解為一種模式,我們不如把這種模式想象成類似於洋蔥一樣的結構,我們可以一層一層剝開,也就是說我們可以一層一層的進入子shell。就好比我們進入一棟樓,開啟一個房間是一個環境,在當前這個房間我們又看到了一個門,當我們開啟這個門的時候,我們就已經進入了新的環境,也就是新的bash中。這牽扯到一個父shell和子shell的問題。

使用者登入到Linux系統後,系統將啟動一個使用者shell。在這個shell中,可以使用shell命令或宣告變數,也可以建立並執行 shell指令碼程式。執行shell指令碼程式時,系統將建立一個子shell。此時,系統中將有兩個shell,一個是登入時系統啟動的shell,另一 個是系統為執行指令碼程式建立的shell。當一個指令碼程式執行完畢,它的指令碼shell將終止,可以返回到執行該指令碼之前的shell。從這種意義上來 說,使用者可以有許多 shell,每個shell都是由某個shell(稱為父shell)派生的。 在子 shell中定義的變數只在該子shell內有效。如果在一個shell指令碼程式中定義了一個變數,當該指令碼程式執行時,這個定義的變數只是該指令碼程式內 的一個區域性變數,其他的shell不能引用它,要使某個變數的值可以在其他shell中被改變,可以使用export命令對已定義的變數進行輸出。 export命令將使系統在建立每一個新的shell時定義這個變數的一個拷貝。這個過程稱之為變數輸出。 同時,在我們使用shell的同時,我們應該清楚shell的一些配置檔案的存放位置,按照範圍來分,可以分為兩種:

(1)全域性配置:

/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

(2)個人配置:

~/.bash_profile
~/.bashrc

我們可以根據shell是否是互動式和shell是否是登入式這兩個維度,來對shell進行分類。

互動式shell和非互動式shell(interactive shell and non-interactive shell)

互動式模式就是在終端上執行,shell等待你的輸入,並且立即執行你提交的命令。這種模式被稱作互動式是因為shell與使用者進行互動。這種模式也是大多數使用者非常熟悉的:登入、執行一些命令、退出。當你退出後,shell也終止了。
shell也可以執行在另外一種模式:非互動式模式,以shell script(非互動)方式執行。在這種模式 下,shell不與你進行互動,而是讀取存放在檔案中的命令,並且執行它們。當它讀到檔案的結尾EOF,shell也就終止了。

舉個例子,最常見的互動式shell,就是我們利用虛擬機器登入Linux系統時的那個等待登入介面,大概如下圖所示:

系統在等待我們鍵入登入的使用者名稱和密碼,這就是一種互動式shell,而非互動式shell就像我們寫的那些很簡單的指令碼,比如一個指令碼展示出:helloworld。這個指令碼不需要我們對其進行互動,它就只是很簡單的將其指令碼中的命令按順序執行。

登入式shell和非登入式shell

 登入shell:是需要使用者名稱、密碼登入後才能進入的shell(或者通過--login”選項生成的shell)。
非登入shell:當然就不需要輸入使用者名稱和密碼即可開啟的Shell,例如:直接命令“bash”就是開啟一個新的非登入shell,在Gnome或KDE中開啟一個“終端”(terminal)視窗程式也是一個非登入shell。
執行exit命令,退出一個shell(登入或非登入shell);
執行logout命令,退出登入shell(不能退出非登入shell)。

互動式登入shell和非互動式登入shell的區別

互動式登入:(清除掉所有變數,通過檔案重新讀入)
(1)直接通過終端輸入賬號密碼登入
(2)使用“su - UserName”切換的使用者
執行順序:(影響該shell的配置檔案)
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile--> ~/.bashrc--> /etc/bashrc

非互動式登入:(會繼承上一個shell的全部變數)
(1)su UserName
(2)圖形介面下開啟的終端
(3)執行指令碼   (當我們執行指令碼的時候.我們就已經進入到了一個子shell)
(4)任何其它的bash例項
執行順序:(影響該shell的配置檔案)

~/.bashrc--> /etc/bashrc--> /etc/profile.d/*.sh

使用./test.sh或者 bash ./test.sh執行指令碼的時候,是開啟一個子shell,這個子shell能繼承上一個父shell的變數,而這個子shell的變數,隨著子shell的退出而消失。當我們用. test.sh 或者source test.sh時,不開啟子shell,在當前shell執行,子shell中的所有值都影響當前。

一般我們對shell進行一些配置的時候,通常都是對~/.bashrc 和/etc/bashrc這兩個檔案進行一些配置。