上一篇提到 Mac OSX 的自動化操作,那其他的作業系統呢?是否也有如此方便的工具?我想應該是有,但 "不見得是系統內建",而我也沒有親自試用過。然而,我上句話說 "不見得是系統內建" 一定會引來其他 Unix-like OS 使用者的抗議 -- "你把 Shell script 放到哪裡去了?!" 所以這篇來談談 Unix-like OS 的強力工具 -- Shell script。
For Unix-like OS
Unix-like OS 包含很多種不同的作業系統,像是 Solaris (昇陽電腦系統)、BSD、Linux 及 Mac OSX 都是,它們的微核心或設計理念都很類似 Unix,有著權限控管、多人使用及穩定度高的特點,故非常適合當作伺服器的作業系統。在 Unix-like OS 中,有著一個共同的 script 語言系統,它就是 Shell script!即使每個作業系統的 Shell 指令都有些差異,但是大致上的使用邏輯及檔案系統的架構都是相似的,再加上隨打即用免編譯的特性,因此 Shell 指令常常可以在這些系統之間共用。
1. Shell script
指令 1 .....
指令 2 .....
變數、迴圈 ......
指令 3 .....
由於 Unix-like OS 本來就是基於伺服器系統 Unix 發展而來,所以絕大部分 (Mac OSX 是個例外) 都很依賴文字指令介面 (CLI),至於圖形介面 (GUI) 常常是之後才掛上去的。而且,在裡面運行的所有程式常常也有此種特性,這意謂著它們在開發階段時,主要就是從文字指令出發去設計並操控,後來附加上的 GUI 所能做到的事,CLI 絕對都可以做得到 (像 MPlayer 在 CLI 裡簡直是強到爆的神物 ....),也因此 Shell script 在 Unix-like OS 使用者眼中是極其強大的工具。
在這裡我不打算講 Shell script 該怎麼寫 (有問題請洽鳥哥 XD),但是大家可以看看 Shell script 的運作邏輯 (如上面的引言) ...... 有注意到一個重點嗎?Shell script 內部在執行時,是以單一一個指令為單位,而事實上每一個指令都是一個應用程式 [1],沒理由指令一下去就是執行到結束 (特別是客製化的命令列程式),它可能會依次問你一些資訊,此時若像上述那樣寫 Shell script,執行到一半就會出錯,因而不能達到你我的需求。
那麼,該怎麼解決上述的問題呢?用指令的 "背景執行" 嗎?基本上是不行的,因為後續的指令不管做了什麼,都不會影響到該背景執行的指令 (除非你把該指令 kill 掉 ...)。我想解法應該不只一種,這裡我就提供其中一種 -- STDIN。
2. STDIN (standard input)
指令 1 < parameters.txt
STDIN、STDOUT 及 STDERR 合稱為 standard streams (有興趣的人可以去查查看),其中比較常用的是 STDOUT,格式是 "指令 > 文字檔",目的在於將該指令的執行結果輸出到其他的文字檔案中,而不是呈現在終端機的畫面內。STDIN 的用途當然與 STDOUT 相反,它能將帶有資訊的檔案,輸入至指令中供其執行,這也意外地讓它達到自動化應答指令的目標,比如說若我將上述引言中的 parameters.txt 設定成下面這個樣子 ....
ABC
1234
(-> 空行)
y
(-> 空行)
代表的意思就是:執行 "指令 1" 之後,步驟 1. 輸入 "ABC",之後按下 "Enter" [2];步驟 2. 輸入 "1234",之後按下 "Enter";步驟 3. 按下 "Enter";步驟 4. 輸入 "y",之後按下 "Enter" (通常是為了確認某事)。
如上,非常簡單,再配合 Shell script 的撰寫,就能達到自動化操作的目的,搞不好幾句程式碼的小程式就能幫你省下幾百小時的時間呢~
=================
最後,我想也有人想到了,談到自動化操作,怎麼能不提到台灣之光 -- Sikuli script 呢?~它直接利用螢幕物件的擷圖去辨別並接受指令,原理完全不同,但它跨平台且能操控的範圍更廣,強烈建議大家去下載來玩玩看,有問題也別忘了給作者 vgod 一點 feedback [3]。
附註
1. 如果你用 echo $PATH 去查詢 Shell 指令路徑的話,可以看到每個指令都是一個編譯好的小程式。
2. 在此先不討論 Enter、Return 及 New line之間的差別 ....
3. 小弟曾經寫過一篇關於 Sikuli 的文章,有興趣的人可以看看。
沒有留言:
張貼留言