Hvordan bruke whiptail til å skrive interaktive skallskript

Mange nybegynnere Linux-brukere ville ha mange mindre problemer med å bruke kommandolinjen hvis de i noen øyeblikk bare måtte ta valg innenfor et begrenset, forhåndsdefinert sett med alternativer som tilbys av skriptet de bruker.

Slike grensesnitt vil også hjelpe alle, inkludert veteranadministratorer, til å gjøre mindre feil. Skallskript kan oppføre seg på denne måten, hvis de er skrevet ordentlig. Å skrive slike manus fra bunnen av, tar imidlertid ofte for mye tid til å være verdt det.

Den mest populære løsningen på denne typen problemer er Gtk-grafikkwidgets levert av Zenity. Jeg bruker også Zenity, og planlegger å skrive om det i fremtidige innlegg. Noen ganger er imidlertid Zenity ikke et alternativ: Hva om du raskt vil skrive et interaktivt shell-skript som også kjøres uten X Windows, kanskje over standard eller nettbasert SSH? Slike saker er ikke uvanlige. Tradisjonelle servere installerer for eksempel normalt ingen grafisk pakke. I disse dager er det også mange FOSS-baserte set-top-bokser, lagringsapparater og andre innebygde enheter som tilbyr en konsoll og et skall, men ingen X Windows. Visst, mange av disse objektene har noe nettadministrasjonsgrensesnitt, men ville det ikke være fint å legge til interaktive skript til dem?

En måte å raskt skrive slike manus på er å bruke whiptail. Som du ser i figur A, produserer whiptail samme type dialoger og menyer som vanligvis finnes i tekstinstallasjonsprosedyrene for mange Linux-distribusjoner. I tillegg til å løpe helt inne i en terminal, har whiptail noen mindre funksjoner enn Zenity. De to viktigste savnede widgetene er den grafiske filvelgeren og kalenderen. Whiptail har imidlertid alle de andre, vanligste grensesnittene du måtte trenge i et shell-script. Mansiden med whiptail er ganske komplett bortsett fra, etter min mening, for ett gap som jeg vil prøve å fylle her. Whiptail-dokumentasjonen beskriver nemlig alle tilgjengelige widgeter og alle alternativene deres, men det er for syntetisk når det kommer til hvor utdataene fra whiptail går, og hvordan du kan hente den.

Figur A

Nesten alle whiptail-funksjoner genererer en binær utgang for å fortelle anropsskriptet hvilke av to knapper (vanligvis "OK" og "Avbryt") brukeren trykket på. Whiptail koder alltid denne informasjonen i utgangsstatusen, som er tilgjengelig i den spesielle skallvariabelen $? . Som et eksempel kommer widgeten i figur A fra dette kodestykket:

 #! / Bin / bash 
 whiptail --yesno "Visste du allerede whiptail?" - ja-knappen "Ja, det gjorde jeg" - ingen-knappen "Nei, har aldri hørt om det" 10 70 
 VALG = $? 

Når du kjører den koden, blir $ CHOICE 0 når du svarer "Ja, det gjorde jeg", 1 hvis du trykker på "Nei ..." og -1 hvis det oppsto en feil.

Som jeg sa, dette er baseadferden til whiptail. Flere funksjoner må imidlertid også overføre til teksten en tekst som brukeren skrev eller valgte. Mansiden sier at slik tekst er skrevet til standardfeilen, men stopper der, uten å beskrive hvordan du kan hente den i praksis. Det er mulig, som forklart i dette eksemplet, direkte å lagre teksten i en skallvariabel. Personlig foretrekker jeg veldig å skrive alt til en midlertidig fil: denne tilnærmingen etterlater spor av hvordan manuset fungerte i tilfelle problemer eller krasjer, og gjør det lettere både å analysere utdataene og forstå koden. For å se hva jeg mener og hvordan du gjør det, kan du se på whiptail-kommandoen som genererer menyen i figur B:

 whiptail - meny "Foretrukket Linux Distro" 10 40 4 \ 
 debian "Venerable Debian" av \ 
 ubuntu "Populær Ubuntu" på \ 
 fedora "Hackish Fedora" av \ 
 centos "Stabil Centos" av \ 
 mynte "Rising Star Mint" off 2> distrochoice 

Figur B

Trikset er i den siste linjen. I Unix har den numeriske deskriptoren for standardfeilen til et program 2 som standardverdi 2. Derfor, hvis du legger 2> distrochoice til whiptail-påkallingen, omdirigeres standardfeilen til distrochoice-filen. Det er der du finner taggen (debian i tilfelle av figur B) som tilsvarer den valgte stemmen, mens $? vil fortsatt fungere som jeg allerede har forklart.

Hvis du trenger å hente flere valg, som vist i figur C, bør du bruke --sjekklistefunksjonen:
 whiptail - sjekkliste "Foretrukne Linux-distros" 15 40 5 \ 
 debian "Venerable Debian" av \ 
 ubuntu "Populær Ubuntu" på \ 
 fedora "Hackish Fedora" av \ 
 centos "Stabil Centos" av \ 
 mynte "Rising Star Mint" off 2> distrochoice 

Figur C

I dette tilfellet er det en ting til å vite. Som standard vil whiptail skrive alt som ble valgt som en kontinuerlig, romskilt liste over siterte verdier:

 marco:> katt distrochoice 
 "ubuntu" "centos" 

Alternativet er å legge til - separat utgang- bryteren som første alternativ. Hvis du gjør det, vil whiptail skrive et valgt alternativ per linje uten anførselstegn:

 marco:> katt distrochoice 
 ubuntu 
 CentOS 

Selvfølgelig er det ingen måte som er bedre enn den andre. Det avhenger av hva slags behandling du trenger å gjøre med dataene som whiptail samlet inn. I alle fall vil det å lagre alt i en fil gi deg all fleksibiliteten som whiptail kan tilby.

© Copyright 2021 | pepebotifarra.com