Gi Bash-skriptene dine et GUI-løft med Zenity!

Det er fullt mulig å inkludere grafiske brukergrensesnitt (GUI) elementer som vinduer, knapper, sjekkbokser, og fremdriftslinjer i dine Bash-skript. Dette kan du gjøre ved å bruke Zenity, et verktøysett som gir dine skript et mer moderne og brukervennlig utseende.

Bash-skripting er et robust programmeringsspråk som er lett tilgjengelig, siden det er integrert i Bash-skallet. Det er kjent for sin enkelhet, og ettersom det er et tolket språk, unngår man komplikasjonen med kompilering. Du kan umiddelbart utføre endringer etter redigering og gjøre skriptet kjørbar, noe som forenkler utviklingsprosessen.

Det er imidlertid et par vanlige innvendinger mot Bash-skript. Den første gjelder hastigheten. Ettersom Bash tolker kommandoene i skriptet, utføres de ikke like raskt som kompilert kode. Dette er likevel en sammenligning av to ulike verktøy, på samme måte som å forvente at en traktor skal være like rask som en bil. De har rett og slett ulike bruksområder.

Det finnes også ulike aspekter ved «hastighet». For eksempel kan man raskt utvikle et Bash-skript og løse et problem raskere enn ved bruk av et mer komplekst, kompilert språk som C.

Den andre innvendingen dreier seg om brukergrensesnittet, som standard er et terminalvindu. Mens dette er tilstrekkelig for personlig bruk eller bakgrunnsjobber, er det situasjoner der et mer visuelt og intuitivt grensesnitt er ønskelig. Det er her et grafisk brukergrensesnitt (GUI) kommer inn. Å kunne integrere GUI-elementer i skriptene dine gir en mye bedre brukeropplevelse.

Zenity-verktøyet

Med zenity kan du implementere en rekke grafiske elementer i dine Bash-skript. Dette verktøyet gir en moderne følelse til skriptene dine, og sørger for at de ser profesjonelle ut. Zenity er en allsidig verktøykasse som kan gi skriptene dine et løft.

Zenity er vanligvis forhåndsinstallert på Ubuntu-, Fedora- og Manjaro-distribusjoner, og er en del av GNOME-miljøet. Brukere av KDE kan vurdere kdialog, men zenity fungerer fint uavhengig av skrivebordsmiljøet.

Denne artikkelen vil vise hvordan du lager forskjellige dialogvinduer fra kommandolinjen, hvordan du fanger opp returverdier og brukerinput i variabler, og hvordan du bruker disse dialogvinduene i skript.

Vi avslutter med et lite eksempel som kombinerer alle de tre typene dialogvinduer.

Kalenderdialogvinduet

Et kalenderdialogvindu lar brukere velge en dato. Med zenity er dette enkelt, og krever kun en enkel kommando:

zenity --calendar

Kalenderdialogen åpnes med dagens dato uthevet. Du kan enkelt navigere mellom måneder og år, og velge en dag ved å klikke på den. Denne dialogen har alle de forventede funksjonene for en datovelger.

Du velger den uthevede datoen ved å klikke «OK» eller dobbeltklikke på en dato. Du kan avbryte valget ved å klikke «Avbryt», trykke «Esc»-tasten eller lukke vinduet.

I eksemplet over er 19. august 2019 valgt. Ved å klikke «OK» lukkes kalenderen, og den valgte datoen skrives til terminalen.

Du kan trygt ignorere meldingen: «GTKDialog kartlagt uten en forbigående forelder. Dette er motet.»

GTK står for GIMP Toolkit, som er et verktøysett brukt for å utvikle GNOME grensesnitt. Det ble originalt utviklet av skaperne av GNU Image Manipulation Program (GIMP). GNU står for GNU is Not Unix.

GTK-motoren sender en advarsel til Zenity-utviklerne om at de bruker en GTK-komponent på en ikke-standard måte.

Fange opp den valgte datoen

Det å skrive ut datoen til terminalen er ikke særlig nyttig i seg selv. For å kunne bruke kalenderen i et skript, må vi fange opp den valgte datoen og bruke den på en fornuftig måte. Vi kan også tilpasse kalenderen en smule.

Vi bruker følgende alternativer når vi bruker kalenderen. Alle må brukes med dobbelt bindestrek (–):

–text: Bestemmer teksten som skal vises i kalenderen, og overskriver standardmeldingen «Velg en dato nedenfra.»
–title: Bestemmer tittelen på kalenderdialogvinduet.
–day: Angir dagen som er valgt når kalenderen åpnes.
–month: Angir måneden som er valgt når kalenderen åpnes.
–year: Angir året som er valgt når kalenderen åpnes.

Vi bruker variabelen ChosenDate for å lagre datoen som kalenderen returnerer. Deretter bruker vi echo $ChosenDate for å skrive ut datoen til terminalen.

Dette gir samme resultat som forrige eksempel, men nå er den valgte datoen lagret i en variabel. Tidligere ble den kun skrevet ut og glemt.

ChosenDate=$(zenity --calendar --text "Velg en dato" --title "How-To Geek Rota" --day 1 --month 9 --year 2019); echo $ChosenDate

Nå viser kalenderen ledeteksten og vinduets tittel. Datoen er satt til vår valgte startdato, ikke dagens dato.

Vi kan også tilpasse formatet på dato-strengen som returneres. Alternativet –date-format skal etterfølges av en formatspesifikasjon, som er en streng med tokens som definerer dataen og formatet for utdata. Tokenene er de samme som brukes med strftime() C språkfunksjon, og det finnes et stort utvalg av dem.

Vi bruker disse tokenene:

%A: Det fullstendige navnet på ukedagen.
%d: Dagen i måneden som et tall.
%m: Måneden som et tall.
%y: Året som to tall (uten århundre).

ChosenDate=$(zenity --calendar --text "Velg en dato" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 --month 9 --year 2019); echo $ChosenDate

En dato velges:

Datoen returneres i vårt valgte format, som viser ukedagsnavnet, etterfulgt av datoen i europeisk rekkefølge: dag, måned, år.

Dialogvinduet for filvalg: Velge en fil

Dialogvinduer for filvalg kan være komplekse. Brukere kan navigere i filsystemet, velge en eller flere filer, og deretter klikke «OK» for å godta valgene eller avbryte prosessen.

Zenity tilbyr denne funksjonaliteten, og det er like enkelt å bruke som kalenderdialogvinduet.

Disse nye alternativene skal vi bruke:

–file-selection: Forteller zenity at vi vil bruke et filvalgsdialogvindu.
–multiple: Lar brukere velge flere filer.
–file-filter: Definerer hvilke filtyper som vises i dialogvinduet.

zenity --file-selection --title "How-To Geek" --multiple --file-filter="*.mm *.png *.page *.sh *.txt"

Dialogvinduet for filvalg har samme funksjonalitet som alle andre filvalgsvinduer.

Brukeren kan navigere i filsystemet og velge ønsket fil.

I dette eksemplet har vi navigert til en ny katalog og valgt filen «button_hybrid.png.»

Når brukeren klikker «OK», lukkes filvalgsvinduet, og filnavnet med tilhørende sti skrives ut til terminalen.

Hvis du har bruk for filnavnet i videre behandling, kan du lagre det i en variabel på samme måte som med datoen fra kalenderen.

Dialogvinduet for filvalg: Lagre en fil

Ved å legge til ett enkelt alternativ kan vi konvertere filvalgsdialogen til en fillagringsdialog. Dette alternativet er -save. Vi vil også bruke –confirm-overwrite-alternativet som ber brukeren om å bekrefte overskriving av en eksisterende fil.

Response=$(zenity --file-selection --save --confirm-overwrite); echo $Response

Dialogvinduet for fillagring vises. Merk at det finnes et tekstfelt hvor brukeren kan skrive inn et filnavn.

Brukeren kan navigere til ønsket plassering i filsystemet, gi et navn til filen, eller klikke på en eksisterende fil for å overskrive den.

I dette eksemplet har brukeren uthevet en eksisterende fil.

Når han klikker «OK», vises et bekreftelsesvindu som ber han bekrefte at han vil erstatte den eksisterende filen. Legg merke til at filnavnet vises i dialogvinduet. Det er denne type oppmerksomhet på detaljer som gir zenity et profesjonelt utseende.

Hvis vi ikke hadde brukt –confirm-overwrite-alternativet, ville filen blitt overskrevet uten noen advarsel.

Filnavnet lagres i variabelen Response, og skrives ut til terminalen.

Meldingsdialogvinduer

Zenity gjør det enkelt å inkludere meldingsdialogvinduer i skriptene dine. Det finnes ferdige dialogvinduer for informasjon, advarsler, feilmeldinger og spørsmål.

For å lage et feilmeldingsdialogvindu, kan du bruke følgende kommando:

zenity --error --width 300 --text "Tillatelse nektet. Kan ikke skrive til filen."

De nye alternativene vi bruker er:

–error: Forteller zenity at vi ønsker et feildialogvindu.
–bredde: Angir den opprinnelige bredden på vinduet.

Feildialogvinduet vises med den angitte bredden, og bruker standard GTK-feilikon.

For å lage et informasjonsdialogvindu, bruker du følgende kommando:

zenity --info --width 300 --text "Oppdatering fullført. Klikk OK for å fortsette."

Det nye alternativet her er –info, som forteller zenity at vi ønsker et informasjonsvindu.

For å lage et spørsmålsdialogvindu, kan du bruke følgende kommando:

zenity --question --width 300 --text "Er du klar for å fortsette?"; echo $?

Det nye alternativet her er –question, som forteller zenity at vi vil ha et spørsmålsdialogvindu.

$? er en spesiell parameter som inneholder returverdien fra den sist utførte kommandoen. Vanligvis vil en nullverdi bety «OK», mens en verdi på en eller mer betyr «Avbryt».

Dette er en generell teknikk som kan brukes med alle zenity-dialogvinduer. Ved å sjekke denne verdien kan skriptet bestemme om dataene fra dialogvinduet skal behandles eller ignoreres.

Vi klikket «Ja», så returkoden er null som indikerer «OK».

For å lage et advarselsdialogvindu, kan vi bruke følgende kommando:

zenity --warning --title "Lite diskplass" --width 300 --text "Det er kanskje ikke nok diskplass til å lagre sikkerhetskopien."

Det nye alternativet er –warning, som forteller zenity at vi vil ha et advarselsdialogvindu.

Advarselsvinduet vises og det inneholder kun en knapp, ettersom det ikke stilles noe spørsmål.

Fremdriftsdialogvinduet

Du kan bruke zenitys fremdriftsdialogvindu for å vise en fremdriftslinje som indikerer fremdriften i skriptet.

Fremdriftslinjen oppdateres i henhold til verdiene som mates inn fra skriptet. For å demonstrere dette konseptet, kan du bruke følgende kommando:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done)

Kommandoen kan brytes ned slik:

Seq-kommandoen går gjennom en sekvens fra 0 til 100, i steg på 10.
For hvert steg lagres verdien i variabelen i, og skrives ut til terminalen.
Kommandoen tar en pause på ett sekund ved hjelp av kommandoen sleep 1.

Vi kan bruke denne kommandoen sammen med zenitys fremdriftsdialogvindu for å demonstrere fremdriftslinjen. Vi overfører utdata fra forrige kommando til zenity:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" --auto-close

De nye alternativene vi bruker er:

–progress: Forteller zenity at vi ønsker et fremdriftsdialogvindu.
–auto-close: Lukker dialogen når fremdriftslinjen når 100 prosent.

Fremdriftsdialogen vises, og linjen beveger seg mot 100 prosent, med en pause på ett sekund mellom hvert steg.

Vi kan bruke konseptet med å overføre verdier til zenity for å implementere fremdriftsdialogvinduet i et skript.

Skriv inn denne teksten i en editor og lagre den som «progress.sh.»

#!/bin/bash

function work-list () {

echo "# Første arbeidselement"
echo "25"
sleep 1

echo "# Andre arbeidselement"
echo "50"
sleep 1

echo "# Tredje arbeidselement"
echo "75"
sleep 1

echo "# Siste arbeidselement"
echo "100"
sleep 1

}

work-list | zenity --progress --title "How-To Geek" --auto-close

exit 0

Her er en oversikt over manuset:

Skriptet definerer en funksjon som heter work-list. Det er her du legger inn kommandoene dine for å utføre arbeidet. Bytt ut hver sleep 1-kommando med dine egne kommandoer.
Zenity aksepterer echo «# …»-linjer og viser dem i fremdriftsdialogvinduet. Endre teksten på disse linjene slik at den sender informative meldinger til brukeren.
Ekkolinjene som inneholder tall, slik som echo «25», aksepteres av zenity og bestemmer fremdriftslinjens verdi.
Funksjonen work-list kalles og output overføres til zenity.

Bruk denne kommandoen for å gjøre skriptet kjørbar:

chmod +x progress.sh

Bruk denne kommandoen for å kjøre skriptet:

./progress.sh

Skriptet kjøres, og tekstmeldingene endres underveis. Fremdriftslinjen beveger seg i steg mot 100 prosent.

Skala-dialogvinduet

Skala-dialogvinduet lar brukere flytte en glidebryter for å velge en numerisk verdi. Dette sørger for at man ikke kan legge inn en verdi som er for høy eller lav.

De nye alternativene er:

–scale: Forteller zenity at vi vil bruke et skala-dialogvindu.
–min-value: Angir minimumsverdien for skalaen.
–max-value: Angir maksimumsverdien for skalaen.
–step: Angir hvor mye glidebryteren flytter seg når piltastene brukes. Dette påvirker ikke glidebryterens bevegelse om brukeren benytter musen.
–value: Angir startverdien og posisjonen til glidebryteren.

Dette er kommandoen vi bruker:

Response=$(zenity --scale --title "How-To Geek" --text "Velg forstørrelse." --min-value=0 --max-value=30 --step=3 --value=15); echo $Response

Skala-dialogvinduet vises, med glidebryteren satt til 15.

Brukeren kan flytte glidebryteren for å velge en ny verdi.

Når brukeren klikker «OK», overføres verdien til variabelen Response og skrives ut til terminalen.

Inntastingsdialogvinduet

Inntastingsdialogvinduet lar brukere skrive inn tekst.

De nye alternativene vi bruker er:

–entry: Forteller zenity at vi vil bruke et inntastingsdialogvindu.
–entry-text: Kan brukes hvis du vil vise en foreslått verdi i tekstfeltet. Vi bruker «» for å tvinge frem et tomt felt. Dette er ikke strengt nødvendig, men vi ønsket å dokumentere alternativet.

Den fullstendige kommandoen ser slik ut:

Response=$(zenity --entry --text "Skriv inn søketerm" --title "How-To Geek" --entry-text=""); echo $Response

Et enkelt dialogvindu vises som inneholder et tekstfelt.

Brukeren kan skrive inn og redigere tekst.

Når han klikker «OK», tildeles verdien han skrev inn til variabelen Respons. Vi bruker ekko for å skrive ut verdien av variabelen til terminalen.

<img src=»https://tipsbilk.net/wp-content/uploads/2022/02/16