A. 什麼是非互動式進程
操作系統與外部最主要的介面就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,向操作系統解
釋你的輸入,並且處理各種各樣的操作系統的輸出結果。 shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸
入,並且可以立即得到響應),或者以shell script(非交互)方式執行。shell script是放在文件中的一串shell和操作系統命令,它們可以被
重復使用。本質上,shell script是命令行命令簡單的組合到一個文件裡面。 Shell基本上是一個命令解釋器,類似於DOS下的command.com
。它接收用戶命令(如ls等),然後調用相應的應用程序。較為通用的shell有標準的Bourne shell (sh)和C shell (csh)。
互動式shell和非互動式shell 互動式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作互動式是因為shell與用戶進行交
互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、簽退。當你簽退後,shell也終止了。 shell也可以運行在另外一種模式:非
互動式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾,shell也就終止了。
shell的類型在UNIX中主要有兩大類shell Bourne shell (包括 sh, ksh, and bash) Bourne shell ( sh) Korn shell ( ksh) Bourne Again
shell ( bash) POSIX shell ( sh) C shell (包括 csh and tcsh) C shell ( csh) TENEX/TOPS C shell ( tcsh)
Bourne Shell 最初的UNIX shell是由Stephen R. Bourne於20世紀70年代中期在新澤西的AT&T貝爾實驗室編寫的,這就是Bourne shell。Bourn
e shell 是一個交換式的命令解釋器和命令編程語言。Bourne shell 可以運行為login shell或者login shell的子shell(subshell)。只有log
in命令可以調用Bourne shell作為一個login shell。此時,shell先讀取/etc/profile文件和$HOME/.profile文件。/etc/profile文件為所有
的用戶定製環境,$HOME/.profile文件為本用戶定製環境。最後,shell會等待讀取你的輸入。
C Shell Bill Joy於20世紀80年代早期,在Berkeley的加利福尼亞大學開發了C shell。它主要是為了讓用戶更容易的使用互動式功能,並把AL
GOL風格的語法結構變成了C語言風格。它新增了命令歷史、別名、文件名替換、作業控制等功能。
Korn Shell 有很長一段時間,只有兩類shell供人們選擇,Bourne shell用來編程,C shell用來交互。為了改變這種狀況,AT&T的bell實驗室
David Korn開發了Korn shell。ksh結合了所有的C shell的互動式特性,並融入了Bourne shell的語法。因此,Korn shell廣受用戶的歡迎。
它還新增了數學計算,進程協作(coprocess)、行內編輯(inline editing)等功能。Korn Shell 是一個互動式的命令解釋器和命令編程語言.它
符合POSIX——一個操作系統的國際標准.POSIX不是一個操作系統,而是一個目標在於應用程序的移植性的標准——在源程序一級跨越多種平台。
Bourne Again Shell (bash) bash是GNU計劃的一部分,用來替代Bourne shell。它用於基於GNU的系統如linux.大多數的Linux(Red Hat, Slac
kware, Caldera)都以bash作為預設的shell,並且運行sh時,其實調用的是bash。
POSIX Shell POSIX shell 是Korn shell的一個變種. 當前提供POSIX shell的最大賣主是Hewlett-Packard。在HP-UX 11.0 , POSIX shell 就
是/bin/sh,而bsh是/usr/old/bin/sh.
各主要操作系統下預設的shell: AIX 下是Korn Shell. Solaris和FreeBSD預設的是Bourne shell. HP-UX預設的是POSIX shell. Linux是Bourn
e Again shell.
【TIP】 #!/usr/bin/sh的用途 shell script的第一行一般都是#!/usr/bin/sh或#!/usr/bin/ksh等,它的用途就是指出本腳本是用的哪種shel
l寫的,執行時系統應該用哪種shell來解釋執行它。
附:LINUX系統的shell原理
Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。
shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向
Linux傳遞命令時,內核會做出相應的反應。 shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用
程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。
有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在於文件系統中某個
目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。
shell首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的實用程序,如ls和rm,也可以
是購買的商業程序,如xv,或者是自由軟體,如emacs)。然後shell在搜索路徑里尋找這些應用程序(搜索路徑就是一個能找到可執行程序的目
錄列表)。如果鍵入的命令不是一個內部命令並且在路徑里沒有找到這個可執行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部
命令或應用程序將被分解為系統調用並傳給Linux內核。
shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如
函數、變數、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。
當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinux系統默認的shell
是BASH),對普通用戶用「$」作提示符,對超級用戶(root)用「#」作提示符。
一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的參數。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或
者在屏幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷信號來中斷它(在正常結束之前,中止它的執行)。
當用戶准備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。
我們來實習一下shell是如何工作的。
$ make work
make:***No rule to make target 『work』. Stop.
$
注釋:make是系統中一個命令的名字,後面跟著命令參數。在接收到這個命令後,shell便執行它。本例中,由於輸入的命令參數不正確,
系統返回信息後停止該命令的執行。
在例子中,shell會尋找名為make的程序,並以work為參數執行它。make是一個經常被用來編譯大程序的程序,它以參數作為目標來進行編
譯。在「make work」中,make編譯的目標是work。因為make找不到以work為名字的目標,它便給出錯誤信息表示運行失敗,用戶又回到系統提
示符下。
另外,用戶鍵入有關命令行後,如果shell找不到以其中的命令名為名字的程序,就會給出錯誤信息。例如,如果用戶鍵入:
$ myprog
bash:myprog:command not found
$
可以看到,用戶得到了一個沒有找到該命令的錯誤信息。用戶敲錯命令後,系統一般會給出這樣的錯誤信息。
B. Bash編程013——環境變數
環境變數可以幫助提升你的Shell體驗。很多程序和腳本都通過環境變數來獲取系統信息,存儲臨時數據和配置信息。
bash使用環境變數( environment variables)來存儲有關shell會話和工作環境的信息。這項功能允許你在內存中存儲數據,以便程序或shell腳本能夠輕松訪問。這是存儲持久山消猛數據的一種簡便方法。bash的環境變數分為兩類:全局變數和局部變數。
補充:bash使用一致的專有環境變數,但是不同發行版的linux可能會添加自己的環境變數,本博客使用的發行版為Ubuntu 16.04.5 Gnome。
全局變數對於shell會話和所有生成的子shell都是可見的。全局環境變數有助於子shell獲取父shell信息。
在Linux中有四個命令可以幫助我們查看所有的環境變數,printenv、env、set、declare。
使用set命令時會一起顯示之前定義的函數,僅顯示變數可以使用如下命令:
局部變數只能在定義它們的進程中可見,Linux也有默認定義的標准局部環境變數。你也可以自己定義局部環境變數,稱為用戶定義局部變數。
set命令會顯示某個特定進程的所有環境變數,包括局部變數、全局變數以及用戶定義變數。
補充:set、env、printenv之間的區別很細微。set命令會顯示出所有變數,並且按照字母順序排序。env和printenv輸出相同,但是僅含有全局變數,並且未對變數排序。
設置局部用戶定義變數,就是之前002一節提到的變數。
注意:一般bash的環境變數都是使用的大寫字母,建議自己的變數名為小寫,避免產生沖突。
設置全局環境變數
先創建一個局部環境變數,然後使用export命令將其導出到全局變數。
使用unset命令,格式unset varname
注意:在子shell中刪除全局環境變數不會影響到父shell的全局環境變數。
HOME:當前用戶的主目錄
IFS:shell用來將文本字元串分割成欄位的一系列字元
PATH:shell用來查找命令的目錄列表。當你輸入一個命令時,shell會按照這個目錄遍歷尋找。
在登錄系統啟動一個bash shell時,默認情況下bash會在幾個文件中查找命令。這些文件叫做啟動文件或者環境文件。bash檢查的啟動文件取決於啟動bash的方式:
登錄Linux系統是,bash作為登錄shell啟動。登錄shell會一次從以下幾個啟動文件中讀取命令。
/etc/profile文件是系統上默認的bash shell的主啟動文件。系統上的每個用戶登錄時都是執行這個文件。
注意: 某些橋老Linux發行版使用了可拆卸式認證模塊(PAM)。這時,PAM文件會在bash啟動前處理,這些文件可能會包含環境變數。PAM文件包括/etc/environment和$HOME/.pam_environment文件。
我們這里來查看一下/etc/profile文件的內容,學了之前的內容的話,這個文件很容易理解。
$HOME目錄下的啟動文件
剩下的啟動文件都啟著同一個作用:提供一個用戶專屬的啟動文件來定義該用戶所用到的環境變數。一般Linux發行版只有到下面這四個啟動文件中的一兩個。
這里列出Ubuntu的啟動文件:
可以看到這里只有.bashrc和.profile兩個文件。
shell會按照以下順序執行啟動文件,找到第一個其他的就會被逗橋忽略。
注意:這里沒有$HOME/.bbashrc,因為該文件是通過上面三個文件中的一個運行的。
我們來查看一下.profile文件,.bashrc文件請自行查看。
注意:這里會檢查當前運行的shell是否是bash,如是的話,檢查是否存在$HOME/.bashrc,若存在則載入該文件。
互動式shell不是登錄系統時啟動的,它可能是你打開終端啟動的。互動式shell不會訪問/etc/profile文件,而是只會檢查用戶HOME目錄中的.bashrc文件。
執行shell腳本是的非互動式shell。腳本能以不同的方式執行,可以啟動子shell執行,也可以在當前shell中執行。
bash提供了一個BASH_ENV的環境變數,當shell啟動一個非互動式shell進程時,它會檢查這個環境邊浪來查看要執行的啟動文件。若有指定的文件,則shell會執行該文件。Ubuntu未設置該變數。
若BASH_ENV未設置,那麼非互動式shell如何獲得環境變數呢?對於以子shell進程執行的情況,子shell會繼承父shell導出的變數(export)。對於在當前shell中執行的情況,變數即為當前shell的變數。
C. 什麼是Linux的登錄shell與非登錄shell
Linux的登錄與非登錄shell的含義及區別:
1、含義:登錄shell,指的是當用戶登錄系統時所取的那個shell,登錄shell屬於互動式shell。
登錄shell將查找4個不同的啟動文件來處理其中的命令,用戶登錄後,在終端上輸入命令,shell立即執行用戶提交的命令,當用戶退出後,shell也終止了。
非互動式:即shell與用戶不存在交互,而是以shellscript的方式執行的,shell讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾EOF,shell也就終止了。
2、完整度不同:如果啟動了一個bash shell而沒有登入系統(如在CLI提示符中鍵入bash),則啟動了一個互動式非登錄shell。
互動式非登錄shell執行/bashrc文件中的命令,在每次執行shell腳本時,都會重新讀取這個文件,所以是最完整的。
3、使用情況不同:登錄shell的初始化文件(比如.bash_profile)通常會運行這個文件。這樣,登錄shell和非登錄shell都可以使用.bashrc中的命令。
4、登陸方式不同:登錄 shell 需要用戶名、密碼登錄後進入的 shell,或者通過--login選項生成的 shell 。
非登錄 shell 是指不需要輸入用戶名和密碼即可打開的 shell,比如輸入命令bash或者sh就能進入一個全新的非登錄 shell,在 Gnome 或 KDE 中打開一個 「terminal」 窗口,也是一個非登錄 shell。
5、數值不同:
查看$0的值,登錄shell返回-bash,而非登錄shell返回的是bash。
需要注意的是:執行exit命令,退出的shell可以是登錄或者非登錄shell;執行logout命令,則只能退出登錄shell,不能退出非登錄shell。
(3)linux非互動式shell擴展閱讀:
登陸shell通常指的是:
1、用戶通過輸入用戶名/密碼(或證書認證)後啟動的shell;
2、通過帶有-l|--login參數的bash命令啟動的shell。
例如,系統啟動、遠程登錄、使用su-切換用戶、通過bash--login命令啟動bash等。
而其他情況啟動的shell基本上就都是「非登陸shell」了。
例如,從圖形界面啟動終端、使用su切換用戶、通過bash命令啟動bash等。
D. linux中的shell究竟是什麼
【一】
shell的含義:
首先shell的英文含義是「殼」;
它是相對於內核來說的,因為它是建議在核的基礎上,面向於用戶的一種表現形式,比如我們看到一個球,見到的是它的殼,而非核。
Linux中的shell,是指一個面向用戶的命令介面,表現形式就是一個可以由用戶錄入的界面,這個界面也可以反饋運行信息;
【二】shell在Linux中的存在形式:
由於Linux不同於Windows,Linux是內核與界面分離的,它可以脫離圖形界面而單獨運行,同樣也可以在內核的基礎上運行圖形化的桌面。
這樣,在Linux系統中,就出現了兩種shell表現形式,一種是在無圖形界面下的終端運行環境下的shell,另一種是桌面上運行的類型Windows
的MS-DOS運行窗口,前者我們一般習慣性地簡稱為終端,後者一般直接稱為shell
【三】shell如何執行用戶的指令
shell有兩種執行指令的方式,一種方法是用戶事先編寫一個sh腳本文件,內含shell腳本,而後使用shell程序執行該腳本,這種方式,我們習慣稱為shell編程。
第二種形式,則是用戶直接在shell界面上執行shell命令,由於shell界面的關系,大家都習慣一行行的書寫,很少寫出成套的程序來一起執行,所以也稱命令行。
總結:shell可以說只是為用戶與機器之間搭建成的一個橋梁,讓我們能夠通過shell來對計算機進行操作和交互,從而達到讓計算機為我們服務的目的。
以上。
參考資料:
【shell的定義】http://ke..com/view/849.htm
【shell學習】http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80