##shell十三問之1: 何為shell?

shell是什麼東西之前,不妨讓我們重新審視使用者計算機系統的關係: (此處為使用者和計算機系統的關係圖)

我們知道計算機的運作不能離開硬件,但使用者卻無法直接操作硬件, 硬件的驅動只能通過一種稱為“操作系統(OSOpertating System)”的軟件來管控。 事實上,我們每天所談的“linux”,嚴格來說只是一個操作系統(OS), 我們稱之為“內核(kernel)”。

然而,從使用者的角度來說,使用者沒有辦法直接操作一個kernel, 而是通過kernel的“外殼”程序,也就是所謂的shell,來與kernel溝通。 這也正是kernelshell的形象命名的的關係。如圖: (此處為kernel-->shell關係圖;)

從技術的角度來說,shell是一個使用者與系統的交互界面(interface), 只能讓使用者通過命令行(command line)來使用系統來完成工作。 因此,shell最簡單的定義就是----命令解釋器( Command Interpreter):

  • 將使用者的命令翻譯給kernel來處理;
  • 同時,將kernel的處理結果翻譯給使用者。

每次當我們完成系統登入(login), 我們就取得一個交互模式的shell, 也稱之為login shell 或者 primary shell

若從進程(process)的角度來說,我們在shell所下達的命令,均是shell所產生的子進程。 這種現象,我暫可稱之為fork

如果是執行shell腳本(shell script)的話,腳本中命令則是由另一個非交互模式的 子shell(sub shell)來執行的。 也就是primary shell產生sub shell的進程,而該sub shell 進程再產生script中所有命令的進程。 (關於進程,我們日後有機會在補充)

這裡, 我們必須知道:kernelshell 是不同的兩套軟件,而且都是可以被替換的:

  • 不同的OS使用不同的kernel;
  • 同一個kernel之上,也可以使用不同的shell;

Linux的預設系統中,通常可以找到好幾種不同的shell, 且通常會被記錄在如下文件中:

/etc/shells

不同的shell有著不同的功能,且彼此各異,或者說“大同小異”。 常見的shell主要分為兩大主流:

  1. sh:
    • burne shell (sh)
    • burne again shell (bash)
  2. csh:
    • c shell (csh)
    • tc shell (tcsh)
    • korn shell (ksh) (FIXME)

大部分的Linux操作系統的預設shell都是bash,其原因大致如下兩種:

  • 自由軟件
  • 功能強大 bash是gnu project最成功的產品之一,自推出以來深受廣大Unix用戶的喜愛, 且也逐漸成為不少組織的系統標準。

书籍推荐