每個系統管理員都需要使用shell指令碼不時地自動執行許多日常工作。其實許多這些小幫手都是來源於命令列,而有時也需要通過使用者輸入。你可以使用Python一類成熟的程式設計語言來完成它,或者你也可以使用Zenity工具。
Zenity是基於GTK+的一個對話方塊工具,並為管理員提供了許多有用的使用者輸入輸出的命令列視窗,能夠很方便的應用於shell指令碼之中。雖然它的工具列表是比較有限的,但是仍然提供了日期選取器,檔案/目錄選擇、列表框、訊息框和進度條。Zenity不是一個直接指令碼,而是在你的指令碼中能夠提供標準輸出結果的工具。在這個Zenity教程中,我們瀏覽過很多關於怎樣使用Zenity的練習執行個體,來把過去曾經易暴露的備份變的更加安全。
Zenity入門
快速Google搜尋將找到許多Zenity教程和Zenity Manual官方網站的連結。你能夠得到一種用Zenity來做什麼的感覺,最好的辦法是開啟終端,並旋轉它。Zenity有內建的協助選項。它提供一個所有選項的列表,包括對每一個對話方塊附加的協助。主要對話方塊的列表包括日曆、輸入、報錯、訊息、檔案選擇、清單、通知、進展、問題、警告、比例和文字資訊。
許多對話方塊有一些簡單的選項設定,例如文本輸入對話方塊。選項包括—進入-預設文本,文本顯示在輸入框的上面;--隱藏-當你輸入密碼的時候掩飾你的輸入。如果在終端上輸入簡單的命令,你會看到對話方塊,並且結果將返回給螢幕。一個例子:使用—進入命令可能看上去像下面這樣:
$ zenity --entry --text=”Please enter your name”
有時候你會根據使用者不同的輸入採取不同的行動,例如,點擊取消鍵。這種類型的互動是需要一些shell指令碼來捕獲對話方塊的輸出,但這並不複雜。如果你不熟悉shell或Bash指令碼,你可以在網上尋找一些很實用的關於Bash的編程入門教程。如果你更喜歡紙質書,你可以試一試最新版的Unix和Linux 系統管理手冊。它有一整章是關於指令碼的介紹,其它31章也是與shell相關的,這是作為一個Linux系統管理員需要掌握的。
檔案和目錄
在指令碼中較常見的任務之一就是使用正在執行的任務來選擇一個需要的檔案或目錄。Zenity的檔案選擇對話方塊提供訪問標準GTK+檔案對話方塊和輸出已選檔案的所有路徑。這個對話方塊包括許多選項:-- 確定-使用關聯檔案的覆蓋,--儲存提示-如果選擇使用現有的檔案,結果就將覆蓋當前的檔案。
下面這行指令碼將顯示一個檔案選擇對話方塊和這個strFileName變數中儲存的結果:
$ strFileName=$(zenity --file-selection --save --confirm-overwrite); echo $strFileName
‘$’後面的‘=’ 促使Bash來替換Zenity命令輸出,作為一個為strFileName變數賦值的目標。用前面的字元‘$’ 來代替echo命令的參數變數strFileName,結果會返回到終端螢幕。
檔案選擇對話方塊的其它選項包括:--multiple用來選擇多個檔案;--file-設定檔案過濾器要顯示的東西;--directory用於啟用目錄唯讀模式。在顯示檔案選擇對話方塊之前,很容易瞭解文本輸入對話方塊到選擇過濾模式之間是如何聯絡起來的。當使用--multiple選項時,你也能夠使用--separator選項來設定什麼字元將用來分割檔案名稱。如果你沒有設定的話,將預設使用‘|’。
總結
通過一個小實驗,你應該能夠掌握如何把Zenity對話方塊添加到一個已存在或新的指令碼裡。任何需要使用者輸入的指令碼都將是一個很好的對象,以及需要使用標準框來顯示輸出。--list選項完成一個偉大的解決方案,如果你需要從使用者的選擇中顯示資料一覽表。有許多像檔案選擇對話方塊一樣的選項,如--checklist和--radiolist用來設定複選框或選項按鈕的第一列。
下面是一個簡單的單行檔案工具來搜尋.log檔案,並顯示在ListBox的對話方塊中:
x=$(find / -name “*.log” |zenity --list --column “Delete” --column “Files” --checklist --height 600 --width 600 --separator=”,”); echo $x
Zenity是很值得花時間努力學習怎樣有效使用它。一旦你開始使用,就不會後悔。