任何一種程式語言都有其最適用的情況及其罩門,Unix shell Programming 也
難逃此宿命。它有幾項優點:
|
1. Script 都是純文字檔,不被特定軟體綁住
| 大部分的檔案都是以文字檔存放,這是非常開放的系統,檔案之間的分享 非常方便,一個程式所產生的檔案很容易為其他程式使用,一個程式 在使用其他程式所產生的檔案時,也不需知道是何種程式所產生的。 比起現行個人電腦視窗系統上的各種使用專屬格式的應用程式而言, 方便很多。
2. 不需編譯,非常容易移植到不同的 Unix 系統下執行
| | shell/awk/sed/ex/perl script 都是純文字檔,也不需 編譯即可使用,非常方便,從一個系統移植到另一系統時,直接 搬過去即可,雖然可能要更動有些系統設定,但是因為不需重新 編譯,可省下不少麻煩。
3. 適合用於開發簡易小軟體
|
| 很多script 長度很短也很簡單,是所謂的 "little program"。 當設計一個專供個人使用的 script時, 幾乎不需另外寫使用手冊,直接看script 就可以瞭解其用法。 要維護也很簡單,不需撰寫複雜的維護手冊或設計手冊。 當然,如果是要寫一個供公眾使用的 script 時,這些囉唆的 額外工作還是要按部就班去做的。
4. 因開發耗時極短,玩家可隨時根據自己的需求動手開發或更改
|
| 如果是專供個人使用的 Script,當然可以隨意的根據自己的需要設計, 反之,如果是使用他人提供的程式時,不但無法完全符合個人需求, 使用者還須花時間去尋找適用程式,更須花時間去 K 使用手冊。 很多時候,還不如自己寫個 shell script,不但更省時間, 也更符合自己的需求。 |
---|
缺點當然是免不了:
|
1. 執行效率較差
| Shell 因為是用 Interpreter 而且是用間接的方式達到目的 (除了程序控制的指令之外,大部分都是叫用 UNIX 的既有程式來執行), 其執行效率不佳。例如,前面所舉的數字產生器,如果是用head, cat, cut 去組合成的話,因為這三個指令是三個不同的程式,呼叫起來要耗費 相當長的時間 (豪秒範圍), 比傳統的 C/C++/Java 的迴圈方式慢很多。 可是,話說回來,終端機前的使用者對於0.001 秒與數秒的反應時間 根本無法察覺差異,即使可以察覺差異,差別也不大。 反而是構思與程式設計所花時間較長, shell script 的設計通常可以省下數小時甚至數天的設計時間, 那差別可大了。程式的執行時間雖然長了數秒鐘,但可節省數小時 的設計時間,對於個人使用的小程式而言,這筆買賣太划算了。
2. 力有未逮之時
|
| Shell 畢竟不是傳統的 general purpose 的程式語言, 有些事是做不到或很難做的,例如,在shell裡進行數學運算 就很麻煩,所以不可能作為大型軟體 的主要開發語言。所幸,後來發明的 perl 程式語言融合了 shell script 及傳統程式語言的優點,其能力已經不下於傳統的 程式語言,現在很多大型公用軟體都是使用perl去撰寫的。 此外,shell script 可以很方便的處理文字檔,但對於非文字檔 及多媒體檔等就很不方便,例如處理微軟的 Winword 所產生的 doc 檔,那就無能為力了。在處理多媒體檔案時,常需用到硬體的 驅動程式,而不幸的是,系統不一定有提供驅動程式的介面。
3. 漏洞難免
|
| 由於設計給個人用的程式不免為了省時省事而忽略了很多 意外的處理,使用不慎時會有嚴重後果,必須非常小心,尤其是 當script 有涉及檔案的更動時,更須特別小心。 話說回來,如果設計用完即丟的小程式時也要將所有意外情況都考慮清楚, 那也省不了多少設計時間,也就失去了原有 little programming 的立意。 有得必有失,得失之取捨,得由使用者視情況決定。 |
---|
#2 Fast tool building #2 Robust #2 ASCII files #3 Interoperability #3 Portable #3 Sharable (in NFS) #3 Easy to maintain/understand #3 Little documentation overhead #3 Save storage space #2 No learning time, no need to read manual #2 Know all the shortcomings # #.bp bad Bad Problems #2 Resource Intensive #3 consume many processes and I/O #3 Slow #2 Not a general purpose programming language #2 May not cover all exceptions #3 trade-off between coding time and robustness |
---|