Quando si tratta di scripting bash, tutti gli script sono principalmente focalizzati sull'operazione da riga di comando. Sia che tu abbia bisogno dell'input dell'utente o che visualizzi alcuni messaggi, tutto viene fatto tramite il terminale. La maggior parte delle persone che scrivono script utilizzando Bash non hanno idea che sia disponibile una serie di strumenti GUI. In questo articolo vedremo uno di questi strumenti chiamato Zenity - un semplice programma che ti consente di creare finestre di dialogo grafiche (GTK+) nella riga di comando e negli script della shell.
Cos'è Zenity?
Zenity è una riscrittura di gdialog, il port di dialog di GNOME che consente di creare un insieme di widget per diverse operazioni in cui gli utenti possono interagire graficamente con lo script. I widget sono basati sul toolkit GTK.
Zenity è un programma open source scritto utilizzando C linguaggio di programmazione. Supporta Linux, BSD e Windows.
Senza ulteriori indugi, vediamo come visualizzare le finestre di dialogo grafiche GTK+ dalla riga di comando e dagli script della shell usando Zenity.
Come installare Zenity in Linux
Innanzitutto, controlla se zenity è installato e disponibile per l'uso eseguendo i seguenti comandi:
$ which zenity /usr/bin/zenity
$ zenity --version 3.32.0
$ zenity --about
Se zenity non è installato nella tua distribuzione, esegui i seguenti comandi a seconda della tua distribuzione per installarlo.
Linux alpino:
$ sudo apk add zenity
Arch Linux:
$ sudo pacman -S zenity
Fedora, RHEL, CentOS, Alma Linux e Rocky Linux:
$ sudo dnf install zenity
Debian, Ubuntu, Linux Mint, Pop OS:
$ sudo apt install zenity
openSUSE:
$ sudo zypper install zenity
1. Aiuto Zenity e opzioni comuni
Per ogni widget è presente un'opzione di aiuto associata attraverso la quale puoi ottenere una serie di opzioni supportate.
Esegui il comando seguente per accedere alla sezione della guida.
$ zenity --help
Ci sono alcune opzioni comuni che possono essere utilizzate insieme a qualsiasi widget. Queste non sono opzioni obbligatorie, ma se utilizzate ti sfrutteranno per modificare il comportamento del widget.
Per ottenere l'elenco delle opzioni comuni, eseguire il comando seguente.
$ zenity --help-general
Vedremo come funzionano queste opzioni nelle prossime sezioni.
2. Finestra di dialogo del messaggio
Una finestra di dialogo di messaggio visualizzerà una finestra di dialogo di errore, avviso, informazioni e domanda. A seconda della situazione, devi utilizzare la finestra di dialogo appropriata nello script.
2.1. Finestra di dialogo di errore
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo di errore, eseguire il comando seguente:
$ zenity --help-error
Per visualizzare la finestra di dialogo di errore nello script, utilizzare il comando seguente. Qui, il --error
flag creerà la finestra di dialogo di errore e --text
flag stamperà il messaggio di testo. Puoi vedere dall'immagine che c'è un'icona di errore associata alla finestra di dialogo.
zenity --error \ --title "Error Message" \ --width 500 \ --height 100 \ --text "Permission denied. Run with sudo or as root user."
Puoi anche vedere dall'immagine sopra, alcune delle opzioni comuni come --width, --height sono usate per controllare la geometria della finestra di dialogo. Il flag --title viene utilizzato per stampare la barra di dialogo con il titolo.
2.2. Finestra di dialogo di avviso
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo di avviso, eseguire il comando seguente:
$ zenity --help-warning
Usa --warning
flag nello script per visualizzare la finestra di avviso e --text
flag per visualizzare il messaggio di avviso.
zenity --warning \ --title "Warning Message" \ --width 500 \ --height 100 \ --text "Disk space exceeded the threshold limit. Check ASAP."
2.3. Finestra di dialogo delle informazioni
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo delle informazioni, eseguire il comando seguente:
$ zenity --help-info
Usa --info
flag nello script per visualizzare l'infobox e --text
flag per visualizzare il messaggio informativo.
zenity --info \ --title "Info Message" \ --width 500 \ --height 100 \ --text "Installation completed successfully."
2.4. Finestra di dialogo della domanda
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo della domanda, eseguire il comando seguente:
$ zenity --help-question
La finestra di dialogo della domanda visualizzerà un messaggio insieme a un Sì o No opzione. Se premi "Sì" , il codice di ritorno sarà "zero" e per "No" il codice di ritorno sarà "uno" . Devi usare i codici di uscita per scrivere ulteriore logica nei tuoi script.
zenity --info \ --title "Info Message" \ --width 500 \ --height 100 \ --text "Installation completed successfully."
3. Finestra di dialogo per l'immissione di testo
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo di immissione del testo, eseguire il comando seguente:
$ zenity --help-entry
La finestra di dialogo per l'immissione di testo richiede l'input per l'utente. Il flag --entry
da utilizzare per creare una finestra di dialogo di immissione. Per visualizzare del testo nella finestra di dialogo, usa il --text
bandiera. Il valore inserito nella casella di testo verrà stampato nel terminale una volta premuto ok. Devi memorizzare l'output in una variabile se desideri elaborare ulteriormente l'input dalla casella di testo come ho fatto di seguito.
$ USR=$(zenity --entry \ --width 500 \ --title "check user" \ --text "Enter the user name"); echo $USR
Se non desideri rendere visibile il testo inserito durante la digitazione, usa il --hide-text
bandiera.
$ USR=$(zenity --entry \ --width 500 \ --title "check user" \ --text "Enter the user name" \ --hide-text); echo $USR
Puoi anche impostare un valore predefinito all'interno della casella di input usando il --entry-text
bandiera. Devi rimuovere il valore e fornire il tuo input o il valore esistente verrà preso come predefinito.
$ USR=$(zenity --entry \ --width 500 \ --title "check user" \ --text "Enter the user name" \ --entry-text $USER); echo $USR
4. Finestra di dialogo della password
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo della password, eseguire il comando seguente:
$ zenity --help-password
La finestra di dialogo della password accetterà nome utente e password utilizzando il --username
e --password
bandiera. L'output verrà visualizzato come (Nome utente | Password). Devi assegnare l'output del comando a una variabile ed estrarre il nome utente e la password per ulteriori elaborazioni.
$ zenity --password --username
5. Finestra di dialogo delle informazioni di testo
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo delle informazioni di testo, eseguire il comando seguente:
$ zenity --help-text-info
La finestra di dialogo delle informazioni di testo stamperà qualsiasi testo da un file o aprirà un URL nella finestra di dialogo. Ad esempio, per leggere un file e visualizzare il testo usa il flag --filename
. Nell'esempio seguente, sto leggendo il /etc/hosts
file.
zenity --text-info \
--title "Hostname Information" \
--filename "/etc/hosts"
Il --checkbox
flag può essere utilizzato per ottenere input dall'utente. Un buon esempio potrebbe essere "Accettare il contratto di licenza". A meno che non selezioni la casella di controllo, il pulsante ok sarà disabilitato.
zenity --text-info \
--title "Hostname Information" \
--filename "/etc/hosts" \
--checkbox "This is a checkbox"
6. Finestra di dialogo Calendario
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo del calendario, eseguire il comando seguente:
$ zenity --help-calendar
La finestra di dialogo del calendario visualizzerà un calendario e ti consentirà di scegliere una data. Devi memorizzare l'output in una variabile, altrimenti la data selezionata verrà stampata nel terminale.
zenity --calendar \ --title="Select a Date" \ --text="Select Date to pull the employee record."
Per impostazione predefinita, è selezionata la data odierna, ma possiamo anche selezionare una data personalizzata utilizzando --day
, --month
e --year
bandiere.
zenity --calendar \ --title="Select a Date" \ --text="Select Date to pull the employee record." \ --year 2015 \ --month 7 \ --day 15
Il formato di output predefinito sarà DD\MM\YY
. È anche possibile creare un output di data personalizzato utilizzando il --date-format
bandiera.
zenity --calendar \ --title="Select a Date" \ --text="Select Date to pull the employee record." \ --date-format %m-%d-%y
7. Finestra di dialogo per la selezione del colore
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo di selezione del colore, eseguire il comando seguente:
$ zenity --help-color-selection
La finestra di dialogo di selezione del colore visualizzerà una tavolozza e ti consentirà di scegliere un colore e l'output sarà un valore RGB. Usa --color-selection
flag insieme a --show-palette
bandiera.
$ COLOR_RGB=$(zenity --color-selection --show-palette) $ echo $COLOR_RGB
8. Finestra di dialogo per la selezione dei file
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo di selezione dei file, eseguire il comando seguente:
$ zenity --help-file-selection
La finestra di dialogo per la selezione dei file ti consentirà di selezionare file o directory e il percorso viene visualizzato come output. Il flag --file-selection
dovrebbe essere usato. Ci sono un paio di flag che possono essere usati nella finestra di selezione dei file.
--filename
=> Percorso del file/directory predefinito--directory
=> Solo le directory da selezionare--multiple
=> Consente di scegliere più nomi di file--save
=> Imposta in modalità di salvataggio
zenity --file-selection \ --title "Select Files" \ --filename "/home/${USER}/" \ --multiple
In caso di selezioni multiple, il percorso del file verrà separato utilizzando il "|"
simbolo.
È possibile impostare un separatore personalizzato utilizzando il --separator
bandiera. Nell'esempio seguente, sto usando due punti (:
) come separatore.
zenity --file-selection \ --title "Select Files" \ --filename "/home/${USER}/" \ --multiple \ --separator :
9. Finestra di dialogo Moduli
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo dei moduli, eseguire il comando seguente:
$ zenity --help-forms
La finestra di dialogo dei moduli consente di creare moduli. Un buon esempio è il nuovo modulo di registrazione utente. Usa --forms
flag per creare la finestra di dialogo del modulo. Ci sono alcuni flag aggiuntivi che possono essere usati insieme ai --forms
bandiera.
--add-entry
=> Aggiungi una nuova voce nella finestra di dialogo del modulo per consentire all'utente di inserire l'input.--text
=> Testo da visualizzare nella finestra di dialogo.--add-password
=> Accetta la password ma non visualizzerà il valore sullo schermo.--calendar
=> Apri il calendario e scegli una data da esso.
Di seguito è riportato un semplice esempio di un modulo di registrazione utente che utilizza la finestra di dialogo dei moduli.
zenity --forms \ --text "Welcome to signup wizard" \ --add-entry "Enter the first name" \ --add-entry "Enter the last name" \ --add-entry "Enter login name" \ --add-password "Enter password"
Il separatore predefinito per i valori di input è "|"
simbolo. Puoi anche personalizzare il separatore usando --separator
bandiera.
10. Finestra di dialogo Avanzamento
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo della barra di avanzamento, eseguire il comando seguente:
$ zenity --help-progress
Usa --progress
flag per creare una barra di avanzamento. Per creare una barra di avanzamento, devi capire come funziona. Dovrebbero essere forniti due input dalla tua parte.
- La riga che contiene solo il numero con l'
echo
il comando verrà considerato come la percentuale di avanzamento. - La riga che inizia con
#
simbolo nelecho
il comando verrà stampato come messaggio di avanzamento.
( echo 10 echo "# Updating repository Index" sleep 5 echo 15 echo "# Reading input files" sleep 5 echo 70 echo "# Installing packages..." sleep 5 echo 100 echo "# Package Installation completed!" ) | zenity --title "Package Installation Progress Bar" --progress --auto-close
Una volta completata la barra di avanzamento, puoi creare una finestra di dialogo per la chiusura automatica utilizzando --auto-close flag.
11. Finestra di dialogo Elenco
Per accedere all'elenco delle opzioni supportate per la finestra di dialogo dell'elenco, eseguire il comando seguente:
$ zenity --help-list
La finestra di dialogo elenco consente di creare un elenco di righe e colonne. Usa --list
flag per creare una finestra di dialogo elenco e --column
flag per aggiungere colonne.
$ zenity --list \ --column "Player" \ --column "Club" \ --column "Country" \ Messi PSG Argentina \ Neymar PSG Brazil \ Ronaldo Manu Portugal
Dai un'occhiata all'esempio sopra. Usando la --column
flag, ho creato tre colonne. Dopo aver creato le colonne, puoi inserire il valore nelle righe successive che verrà visualizzato per ogni riga come ho fatto nell'immagine sopra.
Nella prima colonna è possibile creare checkbox o pulsanti di opzione. Per creare un pulsante di opzione, usa --radiolist
contrassegnare e per creare una casella di controllo, utilizzare --checklist
bandiera. Quando si crea un elenco radio, è obbligatorio aggiungere TRUE o FALSO parole chiave come primo valore per la tua riga. True selezionerà la radiolist o la casella di controllo mentre false lascerà la casella deselezionata.
zenity --list \ --checklist \ --column "checkbox" \ --column "Player" \ --column "Club" \ --column "Country" \ FALSE Messi PSG Argentina \ FALSE Neymar PSG Brazil \ FALSE Ronaldo Manu Portugal
Quando si seleziona la riga e si fa clic su OK, il valore verrà stampato sul terminale con (|
) come separatore. Per impostazione predefinita, sul terminale viene stampata solo la prima colonna. Per stampare l'intera riga, passa --print-column ALL
.
Conclusione
Siamo giunti alla fine dell'articolo. Ho spiegato brevemente cos'è zenity e i diversi widget disponibili per essere utilizzati. Potrebbero non essere sempre necessarie le utilità della GUI. Tuttavia, quando hai bisogno di widget grafici GTK+ nello scripting bash, Zenity tornerà utile tra gli altri strumenti della GUI.