前言
這裡的 shell (殼程式) 是指在 Unix 系統上,用來提供命令列環境的應用程式。在電腦系統中,shell 是核心 (kernel) 和使用者 (user) 間的中介者。基本的功能是接收使用者輸入的指令,將指令傳給系統後執行,並會將執行完的結果回傳給使用者。
Shell 不僅用於處理單行的指令,也有內建程式語言的功能。藉由 shell script (shell script),我們可以組合多個命令列工具,達成單一工具無法達成的複合功能。透過 Unix 的組合哲學,我們不需要為每項任務重寫新的程式,而可以串接現有的工具,用相對省力的方式達成任務。
為什麼要用 Shell Script?
由於以下的好處,我們可以考慮使用 shell script:
- 在 Unix 系統命令列所執行的任務
- 用來自動化重覆性高的任務
- Shell script 易於撰寫和除錯
Shell script 需要搭配 shell 來運行,所以在 Unix 命令列環境中才有用。現行的桌面環境以 Windows 為大宗,無法感受到 shell script 的用途。在許多非桌面環境,包括伺服器、高能運算主機、嵌入式系統等,都有機會用到 Unix 或類 Unix 系統,這時候就有可能用 shell script 搭配命令列工具來完成特定任務。
Shell script 寫好一次後,就可以重覆執行,所以可以用來自動運行固定流程、機械化的任務。如果再搭配 Cron 等定時排程軟體,就可以全自動運行了。Shell script 的本質就是自動化,所以只要設計好可在類 Unix 系統的命令列環境完成的任務,就有可能把該任務轉為 shell script 。
Shell 的核心語法很精簡,再加上是直譯語言,所以寫起來很快。此外,shell 本身就內建除錯器,不需要什麼 IDE 來輔助開發,甚至只要用 nano(1)
這種小型文字編輯器就可以寫了。也不需要圖形介面環境,在純命令列環境就可以寫。
由於 shell script 有這些優點,如果情境適合的話,不一定要用 Perl 或 Python 這類大而全的通用型程式語言,寫 shell script 是可考慮的替代選項。
為什麼不用 Shell Script?
我們在前一節談到 shell script 的優點,但我們不會所有的程式都用 shell 寫,在以下情境,shell script 可能就不是好的選項:
- shell script 可能會消耗大量系統資源
- shell script 的數字運算能力薄弱
- shell script 的可攜性不佳
每當 shell 執行一個外部程式時,就會開一個新的行程 (process)。所以,如果我們要在 shell 中同時呼叫多個程式,等於是同時開多個行程。由於這項性質,shell 不適合用來寫共時性程式。
另外,shell 處理的資料形態皆為字串。對數字來說,僅支援整數,不支援浮點數。而且只支援基本的代數運算。基本上,用 shell script 處理數字算是選錯工具。主流的通用型語言都有處理數字的能力,不需要用石頭砸自己的腳。
雖然 shell 是類 Unix 系統共通的程式,但 shell script 的可攜性其實不好。這是因為不同系統上的命令列工具不一定完全相容。可能會受到版本的差異,也有可能參數不相容。例如,新版的 tar(1)
可以簡單地用以下參數來解壓縮 tarball:
$ tar xf path/to/package.tar.bz2
這時候 tar
會自動判斷檔案的類型。但舊版的 tar
就無法用這樣的參數。
為什麼不能用 Shell Script ?
除了上一節所述的缺點外,有時候我們無法使用 shell script 來解決任務,以下列出一些情境:
- 需要複雜的資料結構
- 需要高效能的運算
- 需要使用圖形介面程式
- 需要使用程式語言的函式庫
- 需要隱藏程式碼
shell script 無法實作資料結構,所以,需要複雜演算法的程式無法用 shell 實作。這時候,得視自己的需求,另行選擇適合的語言。另外,shell script 是以純直譯的方式來執行,效能不會太好,如果很在意程式的效能,就應該使用其他的工具。
shell script 的功能是透過命令列工具來實現,如果要使用圖形介面程式時,就不適合用 shell script 來處理。圖形介面軟體本來就比較適合交互式使用,雖然也有針對圖形介面軟體所開發的自動化程式,但這些自動化程式寫起來不一定會比較簡單。
由於 shell script 是直接和執行檔溝通,如果我們要使用程式語言的函式庫時,無法直接透過 shell script 來呼叫。我們得先用該函式庫的 API 所開放的語言寫命令列工具,再用 shell 呼叫此命令列工具,藉此間接使用特定函式庫。
此外,由於 shell script 是直譯語言,所有的程式碼會毫不保留地給使用者看到。如果我們需要保護程式碼時,就不適合用 shell 或其他的直譯語言,而要用 C、C++、Golang、Rust 等編譯語言來寫程式。
Shell Script 的替代品
Shell script 算是方便但非必備的工具,如果真的不想學 shell script ,也可以用其他的高階語言來替代。只要該語言可以和命令列工具溝通,就可以用來取代 shell script 。在類 Unix 系統上,最適合的語言是 Perl 或 Python。
Perl 本來就是針對 shell、sed(1)
、 AWK 等工具的特性去改進而生的語言,所以相當適合做為 shell script 的替代品。雖然 Perl 不是 POSIX 標準的一部分,但絕大多數的類 Unix 系統都會預裝 Perl。不過,Perl 這幾年落寞了,真正願意投入時間學 Perl 的新人不多。
相對來說,Python 則是這幾年相當火紅的程式語言,用在各方面的任務,包括自動化腳本。由於 Perl 和 Python 在功能上有許多重疊的地方,Python 程式碼又相對易於維護一些,近年來有些程式人就直接用 Python 取代 Perl。
單純以操作命令列工具來說,shell script 一定是最簡短的。所以本節提到的兩個程式語言,僅供不想學 shell script 但又要操作命令列工具時的替代品。
結語
在本文中,我們探討了 shell script 的使用時機,包括適合和不適合的情境。相信在讀完本文後,讀者都可以了解自己為什麼要學 shell script 。在後續的文章中,我們會開始介紹如何寫 shell script 。