Re: bash e whiptail [quasi risolto; quasi]
Comincio a vedere l'uscita... se qualcuno mi dà una spinta forse ci arrivo!
Dapprima ho provato a sostituire whiptail con dialog, così tanto per vedere
se le cose fossero migliorate, ed ho sostituito anche la radiolist con un
semplice menù:
#!/bin/sh
dialog --title "Titolo" --menu "scegline uno" 20 70 10 "A" "Descrizione A"
"B" "Descrizione B"
Lo script fatto così funziona, ma fin qui funzionava già prima. Ancora non
riesco a mettere in una variabile il tag che dialog mi restituisce. Poi, da
programmatore un po' vecchio stile quale sono, ho pensato al tipico
workaround sporco e brutto da vedersi, ma che nella mia testa poteva
funzionare, ovvero redirigere lo standard output di dialog su di un file
temporaneo:
#!/bin/sh
dialog --title "Titolo" --menu "scegline uno" 20 70 10 "A" "Descrizione A"
"B" "Descrizione B" > tag.tmp
Bum! Non funziona più. Di nuovo dialog non visualizza nulla sullo schermo
anche se in effetti viene eseguito. Ecco che mi si è accesa la lampadina:
ma vuoi vedere che la bash, per implementare la funzionalità di
TAG=`comando`
non fa altro che redirigere lo standard output di "comando" e magari anche
lo stderr? E vuoi vedere che dialog e whiptail non fanno altro che usare lo
standard output (o error) con sequenze di escape per "disegnare" la
finestra di dialogo? O forse è ncurses che fa questo?
Però, se così fosse, dovrei trovare un bel po' di spazzatura in tag.tmp,
invece no. Il file resta vuoto. Ma siamo sicuri che è vuoto solo perchè
"cat tag.tmp" non mostra nulla? Proviamo con hexdump. Tada! Ecco la tanta
bella spazzatura che volevamo vedere. È solo che inizia con un bell'EOF,
quindi cat non mostra nulla. Dunque ho capito l'arcano, ma resta il
problema. Come separo la spazzatura dall'output interessante, ovvero come
faccio a permettere a dialog (o whiptail) di disegnare le sue sequenze di
escape sul video ma redirigere la parte che mi interessa? man dialog. Che
belle opzioni, proviamo con "--stdout".
Così funziona. Ma, ahimè, funziona perché in questo modo ncurses scrive su
stderr, il che è sconsigliato sulla pagina di manuale di dialog proprio
dove parla di quell'opzione. Vorrei fare esattamente il contrario (ovvero
vorrei il comportamento di default che è quello corretto), ma senza usare
files temporanei che escono dalla tomba di Turing... Cioè:
dialog ... 2> tag.tmp
TAG=`cat tag.tmp`
funziona, ma non mi piace. Vorrei
TAG=`dialog ...`
dove però a TAG viene assegnato ciò che arriva su stderr, mentre stdout
viene lasciato stare verso il video. C'è un modo di dirlo a bash?
Reply to: