GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit dialogová okna GUI v Bash skriptech pomocí Whiptail v Linuxu

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.

Možnosti
$ 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 nebo klíč. Když stisknete vyvolá to návratový kód 0 a pokud stisknete vyvolá to návratový kód 255 .

$ 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 nebo .

$ 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 vyvolá to návrat kód 0 a když stisknete vyvolá to návratový kód 1 .

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 , vrátí návratový kód 0 a vrátí heslo, které jste zadali do konzole (stderr), pokud spouštíte z terminálu.

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 a vybrat položku ze seznamu a poté stisknout enter. Ale v dialogovém okně nabídky stačí jen stisknout klávesu enter, která vrátí název značky na stderr.

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.


Linux
  1. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  2. Jak vytvořit systém souborů ZFS pomocí komprese souborů v systému Linux

  3. Jak vytvořit soubor s danou velikostí v Linuxu?

  1. Jak vytvořit špičku CPU pomocí příkazu bash

  2. Jak vytvoříte okno v Linuxu s C++?

  3. Jak se Linux vypořádává se skripty shellu?

  1. Jak vytvořit osobní souborový server s SSH na Linuxu

  2. Jak vytvořit diskové oddíly pomocí příkazu Parted v Linuxu

  3. Jak vytvořit zálohu pomocí příkazu tar v Linuxu