2024年5月12日 星期日

easybashgui: 寫一支 bash 小程式、 創造出七種選單

easybashgui, zenity 圖形介面 想要用 bash 寫文字選單, 可以呼叫 dialog; 想要用 bash 寫圖形選單, 可以呼叫 zenity。 那如果希望你的選單可以套用 gum、 dialog、 yad、 gtkdialog、 kdialog、 zenity、 xdialog (蛤, 竟然有這麼多種...) 任何一套選單函式庫, 卻又很懶, 只想寫一次程式就好呢? 那就用 easybashgui 吧!

我們來實做一個 「從 youtube 看新聞」 的選單好了。

  1. 下載 網址與新聞台名稱對照表 (產生方式: vlc 的播放清單,用 xq 轉檔) 跟 我的十列的程式碼
  2. 安裝一些套件: apt install make dialog whiptail zenity
  3. 下載 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 的選單。

easybashgui, dialog 文字介面 如果以文字模式登入本機: 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。 這種 「善用其他既有套件、 執行起來給人超強大的印象」 的輕薄短小程式碼, 我最喜歡了, 用起來有一種騎腳踏車的快感。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。