Whiptail

1. Whiptail

Raul
raulcastro

(usa Fedora)

Enviado em 16/01/2013 - 09:23h

Olá pessoal,

Alguém poderia me ajudar?

Como eu coloco o sleep no infobox do whiptail??


whiptail --title "Teste" --infobox "Teste" 8 78


  


2. Re: Whiptail

Paulo
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








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts