paulo1205
(usa Ubuntu)
Enviado em 17/01/2013 - 13:40h
Como você já deve ter lido na manpage do whiptail, quando você usa a opção "--infobox", ele exibe a mensagem e sai imediatamente.
O problema que deve estar acontecendo com você é que você deve estar usando um terminal que tem a chamada "tela alternativa" (
alternate screen), que a biblioteca ncurses (que tem as funções de manipulação de tela usadas pelo whiptail) sempre usa, se o terminal no qual o programa executa oferecer tal recurso.
No seu caso, então, o whiptail seleciona a tela alternativa durante a inicialização, desenha sua mensagem nela, e retorna à tela original antes de o programa terminar. Sua mensagem continua desenhada na tela alternativa depois que o whiptail termina, mas você não a vê porque voltou à tela original.
Há várias soluções de contorno para o seu problema, tais como:
1) Usar o
dialog em lugar do whiptail.
2) Enganar o whiptail a respeito do tipo do terminal, usando um que seja razoavelmente compatível com o seu terminal, mas não possua tela alternativa. Como geralmente os emuladores de terminal (xterm, gnome-terminal, konsole, rxvt etc.) e o terminal do console de texto do Linux são compatíveis com o ANSI X3.64 (que, por sua vez, é compatível com VT100 e VT102, e todos eles derivam da especificação ECMA-48), você pode assumir essa compatibilidade e executar algo como "
env TERM=ansi whiptail ..." ou "
env TERM=vt100 whiptail ...", sendo que esta última provavelmente exibirá texto somente em preto e branco. (Mas esteja avisado que se alguém, algum dia, executar esse tipo de coisa num terminal que não seja compatível com ANSI X3.64/VT100, tal pessoa pode ter problemas. Deixo isso claro porque eu mesmo, durante um bom tempo, fui usuário de UNIX em terminais de texto seriais, e os terminais do laboratório da minha faculdade eram compatíveis com um monte de coisas, MENOS vt100/ECMA-48/ANSI X3.64.)
3) No início do seu script, verificar qual o tipo do seu terminal para ver se ele tem tela alternativa, e, se tiver, definir variáveis com as sequências de escape para ativar e desativar sua exibição. Depois, então, de executar o whiptail, você envia a sequência para exibir a tela alternativa, espera os segundos que você quiser esperar, e envia a sequência para voltar à tela original.
#!/bin/bash
# Presume que não há tela alternativa.
SELECT_ALT=""
SELECT_PRI=""
# Define sequencias de escape para exibir a tela
# alternativa e restaurar a tela original em
# terminais derivados do xterm (inclui o konsole,
# gnome-terminal e outros).
if (( ${TERM/*xterm*/1} )); then
# Nao basta ser xterm, pois pode ser que as telas
# alternativas esteja desabilitadas. Verifica se
# o terminal corrente tem a propriedade "smcup"
# com tamanho diferente zero (não é o melhor dos
# testes, mas costuma funcionar).
if [[ -n "`tput smcup`" ]]; then
SELECT_ALT=$'\e[?47h'
SELECT_PRI=$'\e[?47l'
fi
fi
# ...
whiptail whiptail --title "Teste" --infobox "Teste" 8 78
echo -n "$SELECT_ALT"
sleep 10
echo -n "$SELECT_PRI"
# ...
4) Em lugar de usar "--infobox", use "--msgbox", mas execute o whiptail sob o comando
timeout, de modo a encerrá-lo caso o usuário não aperte OK antes de se esgotar o tempo (por exemplo, "
timeout 15 whiptail --title "Teste" --msgbox "Teste" 8 78"). O problema disso é que o whiptail não está preparado para lidar com terminação forçada, não restaurando o estado original do terminal quando o timeout o encerra forçosamente. Desse modo, você teria de testar o estado de saída do comando, e eventualmente dar um
reset no terminal, se o timeout tiver ocorrido.
timeout 15 whiptail --title "Teste" --msgbox "Teste" 8 78
(( $? == 124 )) && reset && clear