Před chvílí jsme krátce diskutovali o Zenity , jednoduchý program, který umožňuje vytvářet grafická (GTK+) dialogová okna v příkazovém řádku a skriptech shellu. V tomto článku budeme diskutovat o dalším nástroji GUI s názvem Whiptail které lze použít k vytvoření dialogových oken GUI ve skriptech Bash v Linuxu.
Ne každý skript, který napíšete, potřebuje grafické rozhraní frontendu. Někdy by ale bylo lepší, kdybyste místo spoléhání na interakci s příkazovým řádkem vytvořili grafické rozhraní. V mém případě, pokud je ve skriptu potřeba dlouhý seznam odpovědí, zvolil bych grafické rozhraní.
Whiptail je přátelský nástroj GUI, který používá mloka programovací knihovna. Whiptail nabízí různá dialogová okna pro různé účely. V závislosti na vašem případu použití můžete použít tato dialogová okna, aby byl váš skript interaktivnější.
Nainstalujte Whiptail v Linuxu
Whiptail je předinstalovaný s mnoha distribucemi, ale pokud vaše distribuce nemá nainstalovanou žádnou whiptail, nainstalujte ji podle níže uvedených pokynů.
Chcete-li zkontrolovat, zda je whiptail již nainstalován, spusťte následující příkaz.
$ which whiptail
Chcete-li nainstalovat Whiptail na Debian/Ubuntu a jeho odvozené distribuce, spusťte následující příkaz:
$ sudo apt install whiptail -y
Fedora/RHEL/CnetOS/AlmaLinux/Rocky Linux:
$ sudo dnf install newt
Arch Linux, EndeavourOS, Manjaro Linux:
$ sudo pacman -S whiptail
Alpine Linux:
$ apk add newt
Možnost nápovědy
Můžete použít --help
příznak, který zobrazí seznam podporovaných dialogových oken a dalších možností, které můžete použít. Celkem je podporováno 10 dialogových oken s různými funkcemi a na všechny se podíváme v následujících sekcích.
$ whiptail -help Box options: --msgbox <text> <height> <width> --yesno <text> <height> <width> --infobox <text> <height> <width> --inputbox <text> <height> <width> [init] --passwordbox <text> <height> <width> [init] --textbox <file> <height> <width> --menu <text> <height> <width> <listheight> [tag item] ... --checklist <text> <height> <width> <listheight> [tag item status]... --radiolist <text> <height> <width> <listheight> [tag item status]... --gauge <text> <height> <width> <percent>
1. Schránka zpráv
Okno zpráv zobrazí zprávy pro uživatele a počká, dokud uživatel nestiskne
$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78
Pojďme dekódovat výše uvedený příkaz.
--title | Tímto přidáte název okna |
--msgbox | Tímto se vytiskne zpráva, kterou zadáte v uvozovkách. |
8 78 | Tímto nastavíte výšku (8) a šířku (78) okna. |
Můžete otevřít nový terminál a zkontrolovat proces whiptail. Bude ve stavu spánku. Význam – čeká se, až zmáčknete
$ ps -ef | grep -i whiptail karthick 20023 9251 0 22:41 pts/0 00:00:00 whiptail --title Welcome Message --msgbox Howdy, Welcome to OSTechnix.. 8 78 karthick 20071 19379 0 22:41 pts/1 00:00:00 grep --color=auto -i whiptail
$ ps -q 20023 -o state --no-headers S
POZNÁMKA: Stát (S ) -> přerušitelný spánek (čekání na dokončení události).
2. Informační pole
Info je podobné jako okno se zprávou, ale rozdíl je v tom, že na rozdíl od informačního pole nebude čekat na vstup uživatele. Použijte –-infobox
flag a předat řetězec jako argument, který se zobrazí v informačním poli.
V některých prostředích se informační pole spustí, ale nezobrazí žádný výsledek. Musíte změnit emulaci terminálu a spustit ji jako já v níže uvedeném úryvku.
$ TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78
3. Pole Ano/Ne
Pole Ano/Ne zobrazí dialogové okno s ANO nebo NE možnost kde, pokud zvolíte
Použijte --yesno
příznak pro výzvu k výběru. Spusťte následující úryvek, který kombinuje pole ano/ne a pole zprávy. Nejprve zobrazí možnost Ano/Ne a v závislosti na vaší volbě zobrazí návratový kód.
Vytvořte skript shellu, zkopírujte níže uvedený fragment a spusťte jej.
#!/usr/bin/env bash whiptail --title "CONFIRMATION" --yesno "Should I proceed" 8 78 if [[ $? -eq 0 ]]; then whiptail --title "MESSAGE" --msgbox "Process completed successfully." 8 78 elif [[ $? -eq 1 ]]; then whiptail --title "MESSAGE" --msgbox "Cancelling Process since user pressed <NO>." 8 78 elif [[ $? -eq 255 ]]; then whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78 fi
Pokud nemáte ponětí o podmíněných příkazech bash, podívejte se na náš krátký článek o tomtéž pomocí odkazu níže.
- Skriptování Bash – podmíněné příkazy
4. Textové pole
Textové pole přečte a vytiskne soubor. V níže uvedeném úryvku čtu ostechnix.txt
soubor. Příznak –scrolltext vám umožňuje pomocí kolečka myši posouvat svisle, když máte dlouhé stránky textu, které se nevejdou do aktuálního okna.
$ whiptail --textbox --scrolltext ostechnix.txt 10 80
5. Přesměrování
Dialogová okna, která uvidíte v následující části, vyžadují, aby byl výstup uložen v proměnné a později použit pro zpracování. Vrácená hodnota z widgetu je odeslána do stderr namísto stdout. Takže musíte zaměnit stdout a stderr, aby se výsledek uložil do proměnné.
Pro záměnu stdout a stderr musíte použít následující výraz.
3>&1 1>&2 2>&3
Zkusme porozumět výše uvedenému výrazu. Víte, že FD1 je standardní výstup a FD2 je standardní chyba.
- 3>&1 – Vše, co je přesměrováno na deskriptor souboru 3, je přesměrováno na deskriptor souboru 1.
- 1>&2 - Vše, co je odesláno do deskriptoru souboru 1 (Stdout), je přesměrováno na deskriptor souboru 2.
- 2>&3 - Vše, co je odesláno do deskriptoru souboru 2 (stderr), je přesměrováno na deskriptor souboru 3.
Tímto způsobem zaměňujeme stdout a stderr, takže proměnná může ukládat návratovou hodnotu z dialogových oken.
6. Pole hesla
Pomocí dialogového okna hesla můžete zadat hesla, která se při psaní nebudou zobrazovat jako prostý text. Použijte --passwordbox
výzva k zadání hesla.
$ whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"
Když stisknete
Musíte zachytit heslo do proměnné a později jej použít ve skriptu. Jak je uvedeno v části Přesměrování, musíte přesměrovat výsledek.
$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3) $ echo "The password entered by the user is $PASSWORD"
7. Vstupní pole
Dialogové okno Input vyzve uživatele k zadání vstupu. Stejně jako u dialogového okna pro heslo bude vámi zadaný vstup vytištěn na terminálu, pokud jej spouštíte z terminálu. Musíte použít přesměrování a uložit hodnotu do proměnné, kterou později použít pro zpracování podle logiky vašeho programu.
NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be created" 8 40 3>&1 1>&2 2>&3)
Můžete také nastavit výchozí vstupní text. Vše, co musíte udělat, je přidat text za výšku a šířku. Níže je syntaxe kde místo [init]
umístíte výchozí text.
--inputbox <text> <height> <width> [init]
Příklad:
whiptail --title "Create New User" --inputbox "Username to be created" 8 40 noname
Nyní zkombinujme vstupní pole, pole pro heslo, pole Ano/Ne a textové pole a napišme jednoduchý program pro vytváření uživatelů, abychom viděli, jak lze tato dialogová okna propojit.
8. Dialogové okno kontrolního seznamu
Kontrolní seznam vám umožňuje vytvořit seznam možností, ze kterých si uživatel může vybrat.
--checklist <text> <height> <width> <listheight> [tag item status]...
Výše je syntaxe pro vytvoření dialogového okna kontrolního seznamu. Musíte použít --checklist
příznak následovaný nastavením výšky a šířky dialogového okna.
Možnost <listheight>
určuje, kolik seznamů vytvoříte. Každý seznam bude označen <status>
který je nastaven na ON nebo OFF. On ukazuje na vybraný seznam a Off ukazuje na žádný výběr seznamu.
$ whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" ON
Chcete-li vybrat seznam, stiskněte mezerník a pomocí šipek nahoru a dolů se mezi seznamem pohybujte. Po dokončení stiskněte enter.
Výstup můžete uložit do pole a později jej použít. Názvy značek (“Chrome, pip3, ksnip, virtualbox”) budou vytištěny jako výstup do stderr na základě výběru.
SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" ON 3>&1 1>&2 2>&3))
$ echo ${SELECTED[@]} # Array of values
Ukázkový výstup:
"pip3" "ksnip" "virtualbox"
Pokud nemáte ponětí o bash polích, máme podrobný článek o bash poli. Navrhuji, abyste se podívali na odkaz níže.
- Skriptování Bash – indexované pole s příklady
9. Dialogové okno Seznam rádia
Dialogové okno seznamu rádií je podobné dialogovému oknu kontrolního seznamu, ale jediným rozdílem je, že můžete vybrat pouze jednu možnost ze seznamu. Syntakticky jsou seznam rádií i kontrolní seznam stejné.
--radiolist <text> <height> <width> <listheight> [tag item status]...
Příklad:
SELECTED=$(whiptail --title "Choose Only One Package" --radiolist \ "List of packages" 20 100 10 \ "chrome" "browser" OFF \ "pip3" "Python package manager" OFF \ "ksnip" "Screenshot tool" OFF \ "virtualbox" "virtualization software" OFF 3>&1 1>&2 2>&3)
$ echo $SELECTED virtualbox
10. Dialogové okno nabídky
Dialogové okno Nabídka je podobné dialogovému oknu přepínače. Jediný rozdíl, který cítím, je ten, že v dialogovém okně přepínače musíte stisknout
Syntaxe je podobná kontrolnímu seznamu a přepínacímu tlačítku, ale jediným rozdílem je, že v dialogovém okně nabídky není potřeba zapínat/vypínat volbu „stav“.
--menu <text> <height> <width> <listheight> [tag item]
Příklad:
TO_RUN=$(whiptail --title "Menu example" --menu "Choose an option" 25 78 5 \ "backup" "Start taking defined backup" \ "restore" "restore from last backup" \ "Schedule" "Display active backup schedules" 3>&1 1>&2 2>&3)
$ echo $TO_RUN backup
11. Ukazatel průběhu
Chcete-li vytvořit ukazatel průběhu, musíte použít následující syntaxi. Nejprve předáte text, který se vytiskne, když běží ukazatel průběhu, a nastavíte výšku a šířku okna následovanou procentem průběhu.
--gauge <text> <height> <width> <percent>
Procento pokroku bude řízeno naší logikou. Podívejte se na níže uvedený úryvek. Přesměruji while smyčku na indikátor průběhu a inkrementuji proměnnou COUNTER v 10 počtech, které budou použity jako procento průběhu.
#!/usr/bin/env bash COUNTER=0 while [[ ${COUNTER} -le 100 ]]; do sleep 1 COUNTER=$(($COUNTER+10)) echo ${COUNTER} done | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}
Ukazatel průběhu se bude zvyšovat o 10.
Závěr
Dostali jsme se na konec tohoto článku. Zde jsme krátce viděli, jak používat Whiptail k vytváření různých dialogových oken v bash skriptech. Pokud jste již použili whiptail a máte nějaký trik pod otrokem, podělte se s námi o něj prostřednictvím pole pro komentáře.