您可以在Bash指令碼中使用GUI視窗、滑塊、單選按鈕、進度條等。學習如何使用zenity工具箱,並對Bash指令碼進行整容。我們會教你怎麼做。
Bash指令碼是一種功能強大的程式語言,由於它內建在Bash shell中,因此每個人都可以隨時使用它。這是一種很容易開始程式設計的語言。因為它是解釋的,所以不需要編譯指令碼。一旦編輯了指令碼檔案並使其可執行,就可以執行它。這使得編碼、執行和調試周期非常高效。
人們對Bash指令碼的抱怨主要有兩個,第一個是速度。因為bashshell解釋指令碼中的命令,所以它們的執行速度不如編譯後的程式碼快。然而,這就像抱怨拖拉機不如汽車快;它們的用途不同。
不過,有兩種速度。通常,您可以組合一個快速指令碼並使用它來執行任務,這比用編譯語言(如C)開發解決方案要快得多。
人們對Bash指令碼的第二個抱怨是使用者介面,它是一個終端視窗。當然,有時介面並不重要。如果唯一會使用指令碼的人是它的作者,那麼介面可能就沒那麼重要了。對於執行後臺和批處理型別處理的指令碼也不重要。通常,這樣的指令碼不需要太多(如果有的話)使用者互動。
有時你確實需要一些比終端視窗更直觀、更現代的東西。大多數人都熟悉圖形使用者介面(GUI)。為了給人們一種儘可能無摩擦的體驗,您必須從指令碼中建立和使用GUI元素。
zenity允許您在Bash指令碼中合併大量的圖形介面元素。它是一個強大的工具包,可以給你的指令碼一個現代的感覺和一個現代的,熟悉的外觀。
zenity預裝在Ubuntu、Fedora和Manjaro發行版上。它是侏儒的一部分。如果您使用KDE,那麼您可能希望改為簽出kdialog,儘管zenity確實在任何桌面環境中執行。
本文中的示例向您展示瞭如何從命令列建立不同的對話方塊視窗,如何在變數中捕獲它們的返回值和使用者選擇,以及如何在指令碼中使用對話方塊視窗。
最後是一個小應用程式,它使用了所有三種類型的對話方塊視窗。
日曆對話方塊視窗允許使用者選擇日期。要建立一個具有zenity的命令,需要兩個單詞:
zenity --calendar此時將顯示“日曆”對話方塊視窗。它具有標準日期選取器的所有功能。您可以更改月份和年份,然後單擊某一天來選擇該日期。預設情況下,今天的日期在窗口出現時高亮顯示。
單擊“確定”關閉對話方塊視窗並選擇突出顯示的日期。雙擊一個日期做同樣的事情。
如果不想選擇日期,請單擊“取消”,按鍵盤上的“Esc”鍵,或關閉對話方塊視窗。
在上例中,選擇2019年8月19日。如果使用者單擊“確定”,日曆將關閉,所選日期將在終端視窗中列印。
您可以忽略行“GTKDialog mapped without a transient parent。這是不鼓勵的。”
GTK代表GIMP工具箱,它是用來開發GNOME介面的工具箱。它最初是由GNU影象處理程式(GIMP)的作者設計的。GNU代表GNU不是Unix。
GTK引擎警告zenity的作者,他們以非標準的方式使用了GTK元件。
把日期列印到終端上對我們沒什麼用。如果要從指令碼中呼叫此日曆,則需要捕獲選定的日期值,以便在指令碼中使用它做一些有用的事情。我們還將稍微自定義日曆。
我們將在日曆中使用以下選項。它們必須與雙破折號“–”標誌一起使用:
我們使用一個名為ChosenDate的變數來捕獲從日曆返回的日期。我們使用echo$ChosenDate將日期列印到終端視窗。
是的,我們在上一個示例中獲得了相同的結果,但是在這裡,我們將選定的日期儲存在一個變數中。在上一個示例中,它被列印並遺忘。
ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 -- month 9 --year 2019); echo $ChosenDate現在,日曆顯示我們的提示和視窗標題。日期設定為我們選擇的開始日期,而不是今天的日期。
我們還可以自定義選擇時返回的日期字串的格式。--date format選項後面必須跟一個格式說明符。這是一個令牌字串,用於定義要包含在輸出中的資料和格式。這些標記與strftime()C語言函式中使用的標記相同,並且有大量的選擇。
我們使用的代幣是:
某人選擇日期:
使用我們的格式返回日期。它顯示一週中某一天的名稱,後跟按歐洲順序排列的日期:日、月、年。
檔案選擇對話方塊視窗相當複雜。人們可以瀏覽檔案系統,突出顯示一個或多個檔案,然後單擊“確定”來選擇這些檔案或完全取消選擇。
zenity提供了所有這些功能,等等。它和日曆對話方塊視窗一樣易於使用。
我們將使用的新選項有:
“檔案選擇”對話方塊視窗的功能與其他任何檔案選擇視窗相同。
使用者可以瀏覽檔案系統並選擇自己選擇的檔案。
我們已經瀏覽到一個新目錄並選擇了一個名為“button”的檔案_混合.png.”
單擊“確定”後,檔案選擇對話方塊視窗關閉,檔名和路徑在終端視窗中列印。
如果需要在任何進一步處理中使用檔名,可以將其捕獲到變數中,就像從日曆中獲取日期一樣。
如果新增一個選項,則可以將“檔案選擇”對話方塊視窗變成“檔案儲存”對話方塊視窗。選項是--save。我們還將使用--confirm overwrite選項。這將提示使用者確認要覆蓋現有檔案。
Resp***e=$(zenity --file-selection --save --confirm-overwrite); echo $Resp***e將顯示“檔案儲存”對話方塊視窗。注意,有一個文字欄位,使用者可以在其中鍵入檔名。
使用者可以瀏覽到檔案系統中他選擇的位置,提供檔名,或者單擊現有檔案以覆蓋它。
在上面的示例中,使用者突出顯示了一個現有檔案。
當他單擊“確定”時,會出現一個確認對話方塊視窗,要求他確認是否要替換現有檔案。注意:檔名將出現在警告對話方塊中。正是這種對細節的關注賦予了zenity專業的外觀。
如果我們沒有使用--confirm overwrite選項,檔案將被自動覆蓋。
檔名儲存在變數響應中,該響應將列印到終端視窗。
有了zenity,在指令碼中包含光滑的通知對話方塊視窗是很容易的。您可以呼叫stock對話方塊視窗為使用者提供資訊、警告、錯誤訊息和問題。
要建立錯誤訊息對話方塊視窗,請使用以下命令:
zenity --error --width 300 --text "Permission denied. Cannot write to the file."我們使用的新選項有:
錯誤對話方塊視窗以指定的寬度出現。它使用標準的GTK錯誤圖示。
要建立資訊對話方塊視窗,請使用以下命令:
zenity --info --width 300 --text "Update complete. Click OK to continue."我們使用的新選項是--info,它告訴zenity建立一個資訊對話方塊視窗。
要建立問題對話方塊視窗,請使用以下命令:
zenity --question --width 300 --text "Are you happy to proceed?"; echo $?我們使用的新選項是--question,它告訴zenity建立一個問題對話方塊視窗。
美元?是一個特殊引數。它儲存最近執行的前臺管道的返回值。一般來說,這是最近關閉的程序的值。零值表示“確定”,一個或多個值表示“取消”
這是一種可以應用於任何zenity對話方塊視窗的通用技術。透過在指令碼中檢查此值,可以確定是否應處理或忽略從對話方塊視窗返回的資料。
我們單擊了“是”,所以返回程式碼是一個零,表示“確定”
要建立警告對話方塊視窗,請使用以下命令:
zenity --warning --title "Low Hard Drive Space" --width 300 --text "There may not be enough hard drive space to save the backup."我們使用的新選項是--warning,它告訴zenity建立一個警告對話方塊視窗。
出現警告對話方塊視窗。這不是問題,所以只有一個按鈕。
您可以使用zenity progress對話方塊視窗來顯示一個進度條,該進度條指示指令碼的完成時間。
進度條將根據從指令碼傳入的值進行高階處理。要演示該原理,請使用以下命令:
(for i in $(seq 0 10 100); do echo $i; sleep 1; done)命令如下所示:
我們可以使用zenity進度對話方塊視窗來演示進度條。注意,我們正在將上一個命令的輸出管道化到zenity中:
(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close我們使用的新選項有:
此時將顯示“進度”對話方塊視窗,條形圖將向100%前進,並在每個步驟之間暫停一秒鐘。
我們可以使用將值管道化到zenity的概念,在指令碼中包含進度對話方塊視窗。
在編輯器中輸入此文字並將其另存為“進度.sh.”
!/bin/bash function work-list () { echo "# First work item" echo "25" sleep 1 echo "# Second work item" echo "50" sleep 1 echo "# Third work item" echo "75" sleep 1 echo "# Last work item" echo "100" sleep 1 } work-list | zenity --progress --title "How-To Geek" --auto-close exit 0下面是劇本的細目:
使用此命令使指令碼可執行:
chmod +x progress.sh使用以下命令執行指令碼:
./progress.sh指令碼執行,文字訊息隨著指令碼的每個階段的執行而改變。進度條以100%的步幅移動。
“縮放”對話方塊視窗允許使用者移動滑塊來選擇數值。這意味著她不能輸入太高或太低的值。
我們使用的新選項有:
這是我們正在使用的命令:
Resp***e=$(zenity --scale --title "How-To Geek" --text "Select magnification." --min-value=0 --max-value=30 --step=3 --value15); echo $Resp***e“滑塊”對話方塊窗口出現,滑塊設定為15。
使用者可以移動滑塊以選擇新值。
當她單擊“確定”時,值被傳輸到變數響應並列印到終端視窗。
輸入對話方塊視窗允許使用者輸入文字。
我們使用的新選項有:
完整命令如下所示:
Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***e將出現一個簡單的對話方塊視窗,其中包含一個文字輸入欄位。
有人可以輸入和編輯文字。
當他單擊“確定”時,他輸入的值被分配給變數響應。我們使用echo在終端視窗中列印變數的值。
讓我們把這些技術放在一起,建立一個函式指令碼。指令碼將執行硬體資訊掃描,並在滾動文字視窗中向用戶顯示結果。她可以選擇長掃描或短掃描型別。
對於這個指令碼,我們將使用三種類型的對話方塊視窗,其中兩種對我們來說是新的:
在編輯器中輸入此文字並將其另存為“硬體”-資訊.sh.”
#!/bin/bash # Display hardware listing for this computer TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"` if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi # search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile} # Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}" exit 0使用此命令使其可執行:
chmod +x hardware-info.sh此指令碼建立一個臨時檔案,檔名儲存在TempFile變數中:
TempFile=$(mktemp)指令碼使用--list選項建立一個稱為list對話方塊視窗的zenity對話方塊視窗。行尾的“\”字元告訴指令碼將它們視為一條環繞的長線。過程如下:
如果使用者按下“Cancel”,我們不需要檢查ListType中的值,我們可以簡單地退出。如果他按“確定”,我們需要知道他是選擇了“短”還是“長”單選按鈕:
既然指令碼知道使用者需要哪種型別的掃描,我們就可以執行硬體資訊掃描:
當hwinfo掃描完成時,指令碼呼叫zenity建立一個帶有--text info選項的文字資訊對話方塊視窗。文字資訊對話方塊視窗顯示TempFile檔案的內容:
當用戶關閉文字資訊對話方塊視窗時,指令碼退出。
exit 0我們把它點燃看看。
./hardware-info.sh將顯示列表框。預設情況下選擇“Short”選項。
讓我們選擇“Long”,然後單擊“OK”
“進度”視窗將顯示一個滑動指示器。在硬體掃描完成之前,它一直顯示在螢幕上。
硬體掃描完成後,將顯示文字資訊對話方塊視窗,其中包含掃描的詳細資訊。
單擊“確定”
即使是一個死硬的命令列騎師也不得不承認,幾個GUI對話方塊視窗可以讓一個不起眼的Bash指令碼有一種專業的感覺。
...補補,你會喜歡shell指令碼,因為總是有調整要做。關於如何使用這些模式作為其他指令碼的基礎的一些想法包括: ...
...bash是什麼、不同的模式(互動式和非互動式)以及它是如何產生的基礎知識開始,這個站點提供了一個全面的背景知識來幫助您理解命令列的機制。 ...
...注意上面的參考檔案中配置的字型(標題1為Arial Black等)如何顯示在下面的轉換檔案中。您可以根據需要建立任意數量的這些引用檔案(例如,每個客戶機一個)。然後在編寫時完全忽略格式,並在轉換時一步應用樣式。 ...
...為輸入執行它。這些特殊的應用程式被稱為水滴。下面是如何建立一個: ...
...改其目錄,您可以控制他們可以訪問哪些命令。下面介紹如何在Linux上設定受限shell。 受限炮彈 受限shell不是另一個shell。這是標準外殼的另一種模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下啟動。在本文中,我們將...
Bash不是唯一的Linux shell。很容易嘗試其他的shell,比如非常流行的Zsh。找到一個您喜歡的shell後,使用chsh命令將其設定為預設shell。我們會教你怎麼做。 為什麼貝殼很重要 shell位於您和作業系統之間。它在終端視窗內提供環境...
Linux上有多種型別的環境變數。瞭解如何檢視它們,為本地和遠端登入建立它們,並使它們在重新啟動後仍然有效。 環境變數的工作原理 啟動終端視窗及其內部的shell時,會引用一組變數,以確保shell配置正確。這些變數還確...