Cum să adăugați o interfață grafică la scripturile Linux Shell
Publicat: 2022-01-29 Puteți utiliza ferestre GUI, glisoare, butoane radio, bare de progres și multe altele în scripturile Bash. Aflați cum să utilizați setul de instrumente zenity
și să dați un lifting scripturilor dvs. Bash. Vă vom arăta cum.
Scriptingul Bash este un limbaj de programare puternic și, deoarece este încorporat în shell-ul Bash, este ușor disponibil pentru toată lumea. Este un limbaj ușor în care începeți programarea. Deoarece este interpretat, nu trebuie să vă compilați scripturile. De îndată ce ați editat fișierul script și l-ați făcut executabil, îl puteți rula. Acest lucru face ca ciclul de codare, rulare și depanare să fie destul de eficient.
Există două plângeri principale pe care oamenii le au cu scripturile Bash, iar prima este viteza. Deoarece shell-ul Bash interpretează comenzile din script, acestea nu se execută la fel de repede ca codul compilat. Totuși, este ca și cum te-ai plânge că un tractor nu este la fel de rapid ca o mașină; sunt menite pentru lucruri diferite.
Există, totuși, două tipuri de viteză. De multe ori puteți combina un script rapid și îl puteți utiliza pentru a efectua o sarcină mult mai rapid decât dezvoltarea unei soluții într-un limbaj compilat, cum ar fi C.
A doua plângere pe care oamenii o au cu scripturile Bash este interfața cu utilizatorul - este o fereastră de terminal. Desigur, uneori interfața nu contează. Dacă singura persoană care va folosi vreodată scriptul este autorul acestuia, probabil că interfața nu este atât de importantă. Nici nu contează pentru scripturile care efectuează procesare în fundal și tip lot. În mod obișnuit, astfel de scripturi nu necesită multă interacțiune cu utilizatorul (dacă există).
Există ocazii când aveți nevoie de ceva mai intuitiv și mai modern decât fereastra terminalului. Majoritatea oamenilor sunt familiarizați cu o interfață grafică cu utilizatorul (GUI). Pentru a oferi oamenilor o experiență cât mai lipsită de fricțiuni, trebuie să creați și să utilizați elemente GUI din scripturile dvs.
Aplicația zenity
zenity
vă permite să încorporați o gamă largă de elemente de interfață grafică în scripturile Bash. Este un set de instrumente puternic care oferă scenariilor tale o senzație modernă și un aspect contemporan, familiar.
zenity
este preinstalat pe distribuțiile Ubuntu, Fedora și Manjaro. Face parte din GNOME. Dacă utilizați KDE, poate doriți să verificați în schimb kdialog
, deși zenity
rulează pe orice mediu desktop.
Exemplele din acest articol vă arată cum să creați diferitele ferestre de dialog din linia de comandă, cum să captați valorile lor returnate și selecțiile utilizatorului în variabile și cum să utilizați ferestrele de dialog în scripturi.
Terminăm cu o mică aplicație care folosește toate cele trei tipuri de ferestre de dialog.
Fereastra de dialog Calendar
O fereastră de dialog calendar permite cuiva să selecteze o dată. Pentru a crea unul cu zenity
necesită o singură comandă de două cuvinte:
zenity --calendar
Apare fereastra de dialog calendar. Acesta are toate funcționalitățile la care v-ați aștepta de la un selector de date standard. Puteți schimba luna și anul și faceți clic pe o zi pentru a selecta data respectivă. În mod implicit, data de astăzi este evidențiată când apare fereastra.
Faceți clic pe „OK” pentru a închide fereastra de dialog și pentru a selecta data evidențiată. Făcând dublu clic pe o dată, se face același lucru.
Dacă nu doriți să selectați o dată, faceți clic pe „Anulați”, apăsați tasta „Esc” de pe tastatură sau închideți fereastra de dialog.
În exemplul de mai sus, este selectată 19 august 2019. Dacă utilizatorul face clic pe „OK”, calendarul se închide și data selectată este tipărită în fereastra terminalului.
Puteți ignora linia „GTKDialog mapat fără un părinte tranzitoriu. Acest lucru este descurajat.”
GTK înseamnă GIMP Tool Kit, care este setul de instrumente folosit pentru a dezvolta interfața GNOME. A fost conceput inițial de autorii programului GNU Image Manipulation Program (GIMP). GNU înseamnă GNU's Not Unix.
Motorul GTK îi avertizează pe autorii zenity
că au folosit o componentă GTK într-un mod nestandard.
Captarea valorii datei
Imprimarea datei pe terminal nu face mare lucru pentru noi. Dacă vom apela acest calendar dintr-unul dintre scripturile noastre, trebuie să captăm valoarea datei selectate, astfel încât să putem face ceva util cu el în scriptul nostru. De asemenea, vom personaliza ușor calendarul.
Vom folosi următoarele opțiuni cu calendarul. Acestea trebuie să fie toate utilizate cu drapelul „–” cu liniuță dublă:
- –text : Specifică un șir de text de afișat în calendar. Acesta înlocuiește valoarea implicită, „Selectați o dată de mai jos”.
- –title : Setează titlul ferestrei de dialog calendar.
- –day : Setează ziua care este selectată când se deschide calendarul.
- –lună : Setează luna care este selectată când se deschide calendarul.
- –an : Setează anul care este selectat când se deschide calendarul.
Folosim o variabilă numită ChosenDate
pentru a captura data returnată din calendar. Și folosim echo $ChosenDate
pentru a tipări acea dată în fereastra terminalului.
Da, am obținut același rezultat în exemplul anterior, dar aici avem data selectată stocată într-o variabilă. În exemplul precedent, a fost tipărit și uitat.
ChosenDate=$(zenity -- calendar --text "Alege o dată" --titlu "How-To Geek Rota" --ziua 1 -- luna 9 --anul 2019); echo $ChosenDate
Acum, calendarul afișează solicitarea noastră și titlul ferestrei noastre. Data este setată la data de început aleasă de noi și nu la data de astăzi.
De asemenea, putem personaliza formatul șirului de date returnat atunci când se face o selecție. Opțiunea --date-format
trebuie să fie urmată de un specificator de format. Acesta este un șir de jetoane care definesc datele și formatele care urmează să fie incluse în rezultat. Token-urile sunt aceleași cu cele utilizate cu funcția de limbaj strftime()
C și există o selecție imensă de ele.
Jetoanele pe care le folosim sunt:
- %A : Numele complet al zilei săptămânii.
- %d : ziua lunii sub formă de cifră.
- %m : luna ca cifră.
- %y : Anul ca două cifre (fără secol).
ChosenDate=$(zenity -- calendar --text „Alegeți o dată” --title „Cum să faceți Geek Rota” --date-format="%A %d/%m/%y" --ziua 1 -- luna 9 --anul 2019); echo $ChosenDate
Cineva alege o dată:
Și data este returnată folosind formatul nostru. Afișează numele zilei săptămânii, urmat de data în ordine europeană: zi, lună, an.
Fereastra de dialog Selectare fișier: Alegerea unui fișier
Ferestrele de dialog pentru selecția fișierelor sunt destul de complexe. Oamenii pot naviga prin sistemul de fișiere, evidențiază un fișier sau fișiere și apoi pot face clic pe „OK” pentru a selecta acele fișiere sau pentru a anula complet selecția.
zenity
oferă toate aceste funcționalități și multe altele. Și este la fel de ușor de utilizat ca și fereastra de dialog a calendarului.
Noile opțiuni pe care le vom folosi sunt:
- –file-selection : Spune
zenity
că vrem să folosim o fereastră de dialog de selecție a fișierelor. - –multiple : Permite cuiva să selecteze mai multe fișiere.
- –file-filter : Spune ferestrei de dialog de fișiere ce tipuri de fișiere trebuie afișate.
zenity --file-selection --tile „How-To Geek” --multiple --file-filter='*.mm *.png *.page *.sh *.txt'
Fereastra de dialog de selecție a fișierelor este la fel de funcțională ca orice altă fereastră de selecție a fișierelor.
Utilizatorul poate naviga prin sistemul de fișiere și poate selecta fișierul la alegere.
Am căutat într-un director nou și am selectat un fișier numit „button_hybrid.png”.
Când faceți clic pe „OK”, fereastra de dialog de selecție a fișierelor se închide, iar numele și calea fișierului sunt imprimate în fereastra terminalului.
Dacă trebuie să utilizați numele fișierului în orice procesare ulterioară, îl puteți captura într-o variabilă, așa cum ați făcut pentru data din calendar.
Fereastra de dialog Selectare fișier: Salvarea unui fișier
Dacă adăugăm o opțiune, putem transforma fereastra de dialog de selecție a fișierelor într-o fereastră de dialog de salvare a fișierului. Opțiunea este --save
. De asemenea, vom folosi opțiunea --confirm-overwrite
. Acest lucru solicită persoanei să confirme că dorește să suprascrie un fișier existent.
Răspuns=$(zenity --file-selection --save --confirm-overwrite); echo $Răspuns
Apare fereastra de dialog pentru salvarea fișierului. Rețineți că există un câmp de text în care cineva poate introduce un nume de fișier.
Utilizatorul poate naviga la locația pe care o alege în sistemul de fișiere, poate oferi un nume pentru fișier sau poate face clic pe un fișier existent pentru a-l suprascrie.
În exemplul de mai sus, utilizatorul a evidențiat un fișier existent.
Când dă clic pe „OK”, apare o fereastră de dialog de confirmare care îi cere să confirme că dorește să înlocuiască fișierul existent. Rețineți că numele fișierului apare în dialogul de avertizare. Acesta este genul de atenție la detalii care îi conferă zenity
aspectul său profesional.
Dacă nu am fi folosit opțiunea --confirm-overwrite
, fișierul ar fi fost suprascris în tăcere.
Numele fișierului este stocat în variabila Response
, care se imprimă în fereastra terminalului.
Fereastra de dialog de notificare
Cu zenity
, includerea ferestrelor de dialog de notificare în scripturi este fără efort. Există ferestre de dialog stoc pe care le puteți apela pentru a furniza informații, avertismente, mesaje de eroare și întrebări pentru utilizator.
Pentru a crea o fereastră de dialog cu mesaj de eroare, utilizați următoarea comandă:
zenity --error --width 300 --text "Permisiunea refuzată. Nu se poate scrie în fișier."
Noile opțiuni pe care le folosim sunt:
- –error : Spune
zenity
că vrem să folosim o fereastră de dialog de eroare. - –width : Setează lățimea inițială a ferestrei.
Fereastra de dialog de eroare apare la lățimea specificată. Utilizează pictograma standard de eroare GTK.
Pentru a crea o fereastră de dialog cu informații, utilizați următoarea comandă:
zenity --info --width 300 --text "Actualizare finalizată. Faceți clic pe OK pentru a continua."
Noua opțiune pe care o folosim este --info
, care îi spune lui zenity
să creeze o fereastră de dialog cu informații.
Pentru a crea o fereastră de dialog cu întrebări, utilizați următoarea comandă:
zenity --question --width 300 --text „Sunteți bucuros să continuați?”; eco $?
Noua opțiune pe care o folosim este --question
, care îi spune lui zenity
să creeze o fereastră de dialog cu întrebări.
$?
este un parametru special. Acesta deține valoarea returnată de la conducta de prim-plan executată cel mai recent. În termeni generali, aceasta este valoarea din cel mai recent proces închis. O valoare zero înseamnă „OK”, iar o valoare de una sau mai multe înseamnă „Anulează”.
Aceasta este o tehnică generală pe care o puteți aplica în oricare dintre ferestrele de dialog zenity
. Prin verificarea acestei valori în scriptul dvs., puteți determina dacă datele returnate dintr-o fereastră de dialog ar trebui procesate sau ignorate.
Am făcut clic pe „Da”, așa că codul de returnare este un zero care indică „OK”.
Pentru a crea o fereastră de dialog de avertizare, utilizați următoarea comandă:
zenity --warning --title „Spațiu scăzut pe hard disk” --width 300 --text „Este posibil să nu fie suficient spațiu pe hard disk pentru a salva copia de rezervă”.
Noua opțiune pe care o folosim este --warning
, care îi spune lui zenity
să creeze o fereastră de dialog de avertizare.
Apare fereastra de dialog de avertizare. Nu este o întrebare, deci are doar un buton.
Fereastra de dialog Progres
Puteți folosi fereastra de dialog de progres zenity
pentru a afișa o bară de progres care indică cât de aproape de finalizare este scriptul dvs.
Bara de progres este avansată în funcție de valorile introduse în ea din scriptul tău. Pentru a demonstra principiul, utilizați următoarea comandă:
(pentru i în $(seq 0 10 100); do echo $i; sleep 1; done)
Comanda se descompune astfel:
- Comanda
seq
parcurge o secvență de la 0 la 100, în pași de 10. - La fiecare pas, valoarea este stocată în variabila
i
. Aceasta se imprimă în fereastra terminalului. - Comanda se întrerupe timp de o secundă, din cauza comenzii
sleep 1
.
Putem folosi acest lucru cu fereastra de dialog de progres zenity
pentru a demonstra bara de progres. Rețineți că trimitem ieșirea comenzii anterioare în zenity:
(pentru i în $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --titlu „Cum să faci un geek” -- închidere automată
Noile opțiuni pe care le folosim sunt:
- –progress : îi spune
zenity
că vrem să folosim o fereastră de dialog de progres. - –auto-close : închide dialogul când bara de progres atinge 100 la sută.
Apare fereastra de dialog de progres, iar bara avansează spre 100 la sută, făcând o pauză de o secundă între fiecare pas.
Putem folosi conceptul de transfer al valorilor în zenity
pentru a include fereastra de dialog de progres într-un script.
Introduceți acest text într-un editor și salvați-l ca „progress.sh”.
!/bin/bash function work-list () { echo „# Primul articol de lucru” ecou „25” somn 1 echo „# Al doilea articol de lucru” ecou „50” somn 1 echo „# Al treilea articol de lucru” ecou „75” somn 1 echo „# Ultimul articol de lucru” ecou „100” somn 1 } lista de lucru | zenity --progres --titlu „Cum se face Geek” --închidere automată iesirea 0
Iată o detaliere a scenariului:
- Scriptul definește o funcție numită
work-list
. Aici vă puneți comenzile și instrucțiunile pentru a efectua o muncă reală. Înlocuiți fiecare dintre comenzilesleep 1
cu cele reale. -
zenity
acceptă liniileecho "# ..."
și le afișează în fereastra de dialog de progres. Schimbați textul acestor rânduri, astfel încât să transmită mesaje informative utilizatorului. - Liniile de
echo
care conțin numere, cum ar fiecho "25"
, sunt, de asemenea, acceptate dezenity
și setează valoarea barei de progres. - Funcția work-list este apelată și transmisă în
zenity
.
Utilizați această comandă pentru a face scriptul executabil:
chmod +x progres.sh
Utilizați această comandă pentru a rula scriptul:
./progres.sh
Scriptul rulează, iar mesajul text se modifică pe măsură ce se execută fiecare fază a scriptului. Bara de progres se mișcă în pași către 100%.
Fereastra de dialog Scalare
Fereastra de dialog pentru scară permite cuiva să mute un glisor pentru a alege o valoare numerică. Aceasta înseamnă că nu poate introduce o valoare prea mare sau prea mică.
Noile opțiuni pe care le folosim sunt:
- –scale : Spune
zenity
că vrem să folosim o fereastră de dialog scale. - –min-value : Setează valoarea minimă pentru scară.
- –max-value : Setează valoarea maximă pentru scară.
- –pas : Setează cantitatea în care se deplasează cursorul când sunt folosite tastele săgeți. Acest lucru nu afectează mișcările glisorului dacă cineva folosește mouse-ul.
- –value : Setează valoarea inițială și poziția glisorului.
Aceasta este comanda pe care o folosim:
Răspuns=$(zenity --scale --title „How-To Geek” --text „Selectează mărirea.” --min-value=0 --max-value=30 --step=3 --value15); echo $Răspuns
Fereastra de dialog cu glisorul apare cu glisorul setat la 15.
Utilizatorul poate muta cursorul pentru a selecta o nouă valoare.
Când face clic pe „OK”, valoarea este transferată variabilei Response
și tipărită în fereastra terminalului.
Fereastra de dialog de intrare
Fereastra de dialog de introducere permite cuiva să introducă text.
Noile opțiuni pe care le folosim sunt:
- –entry : Spune
zenity
că vrem să folosim o fereastră de dialog de intrare. - –entry-text : Puteți utiliza acest lucru dacă doriți să introduceți o valoare sugerată în câmpul de introducere a textului. Folosim „” pentru a forța un câmp gol. Acest lucru nu este strict necesar, dar am vrut să documentăm opțiunea.
Comanda completă arată astfel:
Răspuns=$(zenity --entry --text "Introduceți termenul de căutare" --title "Howe-To Geek" --entry-text=""); echo $Răspuns
Apare o fereastră de dialog simplă, care conține un câmp de introducere a textului.
Cineva poate introduce și edita text.
Când dă clic pe „OK”, valoarea pe care a tastat-o este atribuită variabilei Răspuns. Folosim echo pentru a imprima valoarea variabilei în fereastra terminalului.
Punând totul laolaltă
Să punem împreună aceste tehnici și să creăm un script funcțional. Scriptul va efectua o scanare a informațiilor hardware și va prezenta rezultatele utilizatorului într-o fereastră cu text derulant. Ea poate alege un tip de scanare lungă sau scurtă.
Pentru acest script, vom folosi trei tipuri de ferestre de dialog, dintre care două sunt noi pentru noi:
- Prima este o fereastră de dialog cu listă. Permite cuiva să facă o alegere.
- A doua este o fereastră de dialog de progres care îi informează utilizatorului că se întâmplă ceva și ar trebui să aștepte.
- A treia este o fereastră cu informații text, care afișează rezultatele utilizatorului.
Introduceți acest text într-un editor și salvați-l ca „hardware-info.sh”.
#!/bin/bash # Afișează lista de hardware pentru acest computer TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --titlu „Scanare hardware” \ --text „Selectați tipul de scanare:” \ --coloana „Selectați” \ --coloana „Tip de scanare” ADEVĂRAT „Scurt” FALSE „Lung”` dacă [[ $? -eq 1 ]]; atunci # au apăsat Anulare sau au închis fereastra de dialog zenity --error --title="Scanare refuzată" --width=200 \ --text="Scanare hardware omisă" iesirea 1 elif [ $ListType == „Scurt” ]; atunci # au selectat butonul radio scurt Flag="--short" altfel # au selectat butonul radio lung Flag="" fi # căutați informații despre hardware cu valoarea corespunzătoare în $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Colaționarea informațiilor" --progress \ --pulsate --text="Se verifică hardware-ul..." \ --auto-kill --auto-close) >${TempFile} # Afișează informațiile hardware într-o fereastră de defilare zenity --width=800 --height=600 \ --titlu „Detalii hardware” \ --text-info --filename="${TempFile}" iesirea 0
Utilizați această comandă pentru a o face executabilă:
chmod +x hardware-info.sh
Acest script creează un fișier temporar, iar numele fișierului este păstrat în variabila TempFile:
TempFile=$(mktemp)
Scriptul folosește opțiunea --list
pentru a crea o fereastră de dialog zenity
numită fereastra de dialog listă. Caracterele „\” de la sfârșitul rândurilor spun scriptului să le trateze ca pe o singură linie lungă care este înfășurată. Iată procesul:
- Specificăm o lățime și o înălțime pentru fereastră.
- Fereastra de dialog listă acceptă coloane. Opțiunea
--radiolist
face ca prima coloană să fie o coloană de butoane radio. - Am stabilit un titlu și un mesaj text pentru fereastră.
- Am setat titlul primei coloane să fie „Selectați”. Conținutul acestei coloane va fi butoanele radio.
- Setăm titlul celei de-a doua coloane să fie „Selectați” și oferim conținutul celei de-a doua coloane. Această coloană conține două etichete de text: „Scurt” și „Lung”. Indicatorii TRUE și FALSE înseamnă că opțiunea „Scurt” este selectată implicit atunci când apare fereastra de dialog.
- Stocăm rezultatul din această fereastră de dialog într-o variabilă numită
ListType
.
ListType=`zenity --width=400 --height=275 --list --radiolist \ --titlu „Scanare hardware” \ --text „Selectați tipul de scanare:” \ --coloana „Selectați” \ --coloana „Tip de scanare” ADEVĂRAT „Scurt” FALSE „Lung”`
Dacă utilizatorul apasă „Anulează”, nu trebuie să verificăm valoarea în ListType,
putem pur și simplu să ieșim. Dacă apăsă „OK”, trebuie să aflăm dacă a selectat butonul radio „Scurt” sau „Long”:
- Parametrul special
$?
este egal cu zero dacă utilizatorul a apăsat „OK”. Este egal cu unu dacă a apăsat „Anulează” sau a închis fereastra. - Dacă este egal cu unu, scriptul afișează o fereastră de dialog cu informații despre eroare și iese. Dacă apăsă „OK”, trecem la testarea valorii din variabila
ListType
. - Dacă variabila
ListType
deține valoarea „Short”, scriptul setează o variabilă numităFlag
la „–short”. - Dacă variabila
ListType
nu deține valoarea „Scurt”, trebuie să păstreze valoarea „Long”. Scriptul setează o variabilă numităFlag
la egală cu „”, care este un șir gol. - Scriptul folosește variabila
Flag
în secțiunea următoare.
dacă [[ $? -eq 1 ]]; atunci # au apăsat Anulare sau au închis fereastra de dialog zenity --error --title="Scanare refuzată" --width=200 \ --text="Scanare hardware omisă" iesirea 1 elif [ $ListType == „Scurt” ]; atunci # au selectat butonul radio scurt Flag="--short" altfel # au selectat butonul radio lung Flag="" fi
Acum că scriptul știe ce tip de scanare dorește utilizatorul, putem efectua scanarea informațiilor hardware:
- Scriptul apelează comanda
hwinfo
și îi transmite valoarea din variabilaFlag
. - Dacă
Flag
conține „–short”, comandahwinfo
efectuează o scanare scurtă. Dacă valoareaFlag
este „”, nimic nu trece lahwinfo
și se efectuează o scanare lungă implicită. - Scriptul transmite rezultatul de la
hwinfo
întee
.tee
trimite ieșirea înzenity
șiTempFile
. - Scriptul creează o fereastră de dialog cu bara de progres. Setează lățimea și înălțimea ferestrei de dialog, precum și titlul și textele prompte.
- Scriptul nu poate ști în avans câte informații va produce comanda
hwinfo
, așa că nu poate seta bara de progres să avanseze corect la 100%. Opțiunea--pulsate
face ca dialogul de progres să afișeze un indicator în mișcare. Acest lucru informează utilizatorul că se întâmplă ceva și ar trebui să aștepte. - Opțiunea
--auto-kill
încheie scriptul dacă cineva face clic pe „Anulează”. - Opțiunea
--auto-close
face ca dialogul de progres să se închidă automat când procesul de monitorizare se încheie.
# căutați informații despre hardware cu valoarea corespunzătoare în $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Colaționarea informațiilor" --progress \ --pulsate --text="Se verifică hardware-ul..." \ --auto-kill --auto-close) >${TempFile}
Când scanarea hwinfo
se termină, scriptul apelează zenity
pentru a crea o fereastră de dialog cu informații text cu opțiunea --text-info
. Fereastra de dialog cu informații text afișează conținutul fișierului TempFile
:
- Scriptul stabilește lățimea și înălțimea ferestrei de dialog și textul titlului.
- Opțiunea
--flename
este folosită pentru a citi conținutul fișierului deținut în variabilaTempFIle
.
# Afișează informațiile hardware într-o fereastră de defilare zenity --width=800 --height=600 \ --titlu „Detalii hardware” \ --text-info --filename="${TempFile}"
Când utilizatorul închide fereastra de dialog cu informații text, scriptul se iese.
iesirea 0
Să-l pornim și să aruncăm o privire.
./hardware-info.sh
Apare caseta cu listă. Opțiunea „Scurt” este selectată implicit.
Să selectăm „Long”, apoi facem clic pe „OK”.
Fereastra de progres apare cu un indicator glisant. Rămâne pe ecran până la finalizarea scanării hardware.
Când scanarea hardware este completă, apare fereastra de dialog cu informații text cu detaliile scanării.
Faceți clic pe „OK”.
Chiar și un jockey de linie de comandă dornic trebuie să admită că câteva ferestre de dialog GUI pot oferi unui script Bash umil o notă profesională.