想要用 bash 寫文字選單, 可以呼叫 dialog; 想要用 bash 寫圖形選單, 可以呼叫 zenity。 那如果希望你的選單可以套用 gum、 dialog、 yad、 gtkdialog、 kdialog、 zenity、 xdialog (蛤, 竟然有這麼多種...) 任何一套選單函式庫, 卻又很懶, 只想寫一次程式就好呢? 那就用 easybashgui 吧!
我們來實做一個 「從 youtube 看新聞」 的選單好了。
- 下載 網址與新聞台名稱對照表 (產生方式: vlc 的播放清單,用 xq 轉檔) 跟 我的十列的程式碼
- 安裝一些套件:
apt install make dialog whiptail zenity
- 下載 ebg 程式碼, 並且安裝:
cd .../easybashgui ; sudo make install
然後就可以執行: chmod a+x watch-news.sh ; ./watch-news.sh
選單就出現了! 雙擊一個選項, 終端機會印出一些資訊,
並且等待3秒, 又回到選單, 可以繼續選下一個選項。
點選 「取消」 程式就結束。
如果把 # vlc -f $url
那一句的註解打開,
就真的可以進入全螢幕模式 (-f) 看新聞。 不想看的時候, 按 ctrl-L 鍵結束,
離開 vlc 就又回到 watch-news.sh 的選單。
如果以文字模式登入本機: ssh localhost
再下一次相同的指令, 因為 ebg 發現它不在 X window 環境內,
所以叫出來的就是 dialog 選單
(當中還穿插一些數字, 不過我們可以直接忽略)。
請閱讀 docs/install.md。
它支援 7 種選單函式庫, 見 gtk 說 gtk 話, 見 qt 說 qt 話。
事實上作者甚至明確表達: 反對 ebg 的使用者
(我們 scripting programmers) 把其中任何一個函式庫列為建議的套件。
「不需要。」
手冊 man easybashgui
的最後面,
有每一種 widget (message、 question、 text、 單選的 menu、
複選的 list、 調整數值大小的 adjust、 ... 等等) 的使用方式。
但是他的程式碼怪怪的, 我看不太懂, 所以就把
...="$(0< "${dir_tmp}/${file_tmp}" )"
都改成
...=$( cat ${dir_tmp}/${file_tmp} )
。
我的程式碼也示範如何顯示某個欄位 (例: 電視台名稱) 卻又使用其他的欄位 (例: youtube 網址)。 "menu" 的傳回值就是當初顯示給使用者看的欄位, 可是這個欄位裡面可能會有一些特殊字元, 如果要拿它到原始的 csv 檔裡面去撈出 (grep) 對應的那一列, 可能會觸發 正規表示式 的特殊規則, 很容易出錯。 所以建置選單的時候, 我把 csv 檔的每一列最前面動態地加上列號 (在 perl 裡面, 用 $. 表達); 從使用者那邊讀到答案之後, 只抓出前面列號數字, 再用 「數第幾列」 的方式來抓出想要的那一列。 第一個版本長這樣:
menu $( perl -pe 's/.*?,(.*)/"$. $1"/' news-channels.csv ) ... ans_i=$( echo $ans | perl -ne 'print("$1") if m/^(\d+)/' )
這在 zenity 圖形介面裡面沒有問題, 可是到了 dialog 文字介面, 它會在前面加數字, 而且它的邊框也是文字, 搜尋的時候 「鎖定最左邊」 的比對就會失敗, 所以數字前後加上較少用的 "#" 號, 這樣比較容易搜尋。
很懷念簡單的 pdmenu。 可惜後來它沒有採用較新的函式庫, 就 被 debian 踢出去了。 還好現在發現 ebg。 這種 「善用其他既有套件、 執行起來給人超強大的印象」 的輕薄短小程式碼, 我最喜歡了, 用起來有一種騎腳踏車的快感。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。