[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: