Tabla de contenido
No mundo da administração de sistemas, é comum encontrar a necessidade de automatizar tarefas através de scripts de shell. No entanto, às vezes precisamos tornar esses scripts interativos para facilitar a experiência do utilizador, especialmente em ambientes onde não se dispõe de uma interface gráfica completa. É aqui que entram em jogo ferramentas como Dialog e Whiptail.
Tanto o Dialog como o Whiptail são ferramentas que permitem criar interfaces gráficas simples e funcionais dentro de um terminal de texto. Estas ferramentas são muito úteis para desenvolver menus, caixas de diálogo, listas de seleção, barras de progresso e muito mais. Ao longo deste artigo, iremos guiá-lo pelos conceitos básicos e exemplos práticos de ambas as ferramentas para que possa utilizá-las nos seus próprios scripts.
O que é o Dialog?
O Dialog é uma ferramenta de linha de comandos utilizada para gerar caixas de diálogo interativas em terminais baseados em texto. É amplamente utilizada em scripts de shell para criar menus interativos, caixas de confirmação, formulários, barras de progresso, entre outros. O Dialog permite aos utilizadores interagir com um script através de uma interface de utilizador baseada em texto, o que é especialmente útil em ambientes de servidores onde não se dispõe de uma interface gráfica completa.
Instalação do Dialog
Para instalar o Dialog numa distribuição baseada em Debian ou Ubuntu, simplesmente execute o seguinte comando:
sudo apt-get update sudo apt-get install dialog
Para distribuições baseadas em Red Hat como CentOS ou Fedora:
sudo yum install dialog
Exemplos básicos de Dialog
Caixa de mensagem simples
Este exemplo mostra uma caixa de mensagem simples que tem apenas um botão “OK”:
#!/bin/bash dialog --title "Mensagem" --msgbox "Olá, esta é uma caixa de mensagem simples." 6 50
Explicação: Neste script, –title define o título da caixa de diálogo, –msgbox é o tipo de diálogo utilizado, e “6 50” são as dimensões da caixa (6 linhas de altura e 50 caracteres de largura).
Menu interativo
O exemplo seguinte cria um menu onde o utilizador pode selecionar uma opção:
#!/bin/bash opcao=$(dialog --title "Menu Principal" --menu "Selecione uma opção:" 15 50 4 1 "Opção 1" 2 "Opção 2" 3 "Opção 3" 4 "Sair" 3>&1 1>&2 2>&3) clear echo "Selecionou a opção: $opcao"
Explicação: O menu é mostrado com opções numeradas. 3>&1 1>&2 2>&3 é utilizado para redirecionar a seleção do utilizador de volta para a saída padrão.
Lista de seleção
Neste exemplo, o utilizador pode selecionar um ou mais itens de uma lista:
#!/bin/bash opcoes=$(dialog --title "Seleção de Pacotes" --checklist "Selecione os pacotes que deseja instalar:" 15 50 5 1 "Apache" off 2 "MySQL" off 3 "PHP" off 4 "Python" off 5 "Java" off 3>&1 1>&2 2>&3) clear echo "Pacotes selecionados: $opcoes"
Explicação: –checklist cria uma lista de itens com caixas de verificação, onde off indica que a caixa está desmarcada por defeito.
Barra de progresso
As barras de progresso são úteis para mostrar o avanço de uma tarefa. Aqui tens um exemplo:
#!/bin/bash { for ((i = 0 ; i <= 100 ; i+=10)); do sleep 1 echo $i done } | dialog --title "Progresso" --gauge "A instalar..." 10 70 0
Explicação: –gauge é utilizado para criar uma barra de progresso. O ciclo for simula o avanço de uma tarefa, incrementando a barra em 10% a cada segundo.
O que é o Whiptail?
O Whiptail é uma alternativa leve ao Dialog que também permite criar interfaces interativas baseadas em texto em scripts de shell. Embora o Whiptail ofereça um conjunto semelhante de funcionalidades, é especialmente útil em sistemas onde o Dialog não está disponível ou onde se prefere uma ferramenta mais leve.
Instalação do Whiptail
Para instalar o Whiptail no Debian, Ubuntu e seus derivados:
sudo apt-get update sudo apt-get install whiptail
Em distribuições como CentOS, Red Hat e Fedora:
sudo yum install newt
Exemplos básicos de Whiptail
Caixa de mensagem simples
Tal como com o Dialog, podes criar uma caixa de mensagem simples:
#!/bin/bash whiptail --title "Mensagem" --msgbox "Esta é uma mensagem simples usando Whiptail." 8 45
Explicação: Este exemplo é semelhante ao do Dialog, mas utilizando o Whiptail. As dimensões da caixa são ligeiramente diferentes.
Menu interativo
Criar menus interativos é simples com o Whiptail:
#!/bin/bash opcao=$(whiptail --title "Menu Principal" --menu "Escolha uma opção:" 15 50 4 \ "1" "Opção 1" \ "2" "Opção 2" \ "3" "Opção 3" \ "4" "Sair" 3>&1 1>&2 2>&3) clear echo "Selecionou a opção: $opcao"
Explicação: Este script funciona de maneira semelhante ao exemplo do Dialog, permitindo que o utilizador selecione uma opção de um menu.
Lista de seleção
O Whiptail também permite criar listas de seleção com caixas de verificação:
#!/bin/bash opcoes=$(whiptail --title "Seleção de Pacotes" --checklist "Selecione os pacotes que deseja instalar:" 15 50 5 \ "Apache" "" ON \ "MySQL" "" OFF \ "PHP" "" OFF \ "Python" "" OFF \ "Java" "" OFF 3>&1 1>&2 2>&3) clear echo "Pacotes selecionados: $opcoes"
Explicação: Neste exemplo, “ON” indica que a caixa de verificação está marcada por defeito, ao contrário do “off” do Dialog.
Barra de progresso
Finalmente, aqui tens um exemplo de uma barra de progresso com o Whiptail:
#!/bin/bash { for ((i = 0 ; i <= 100 ; i+=10)); do sleep 1 echo $i done } | whiptail --gauge "A instalar..." 6 50 0
Explicação: Este exemplo é muito semelhante ao do Dialog, mas utilizando a sintaxe do Whiptail.
Tanto o Dialog como o Whiptail são ferramentas poderosas e flexíveis que permitem aos administradores de sistemas e desenvolvedores criar interfaces de utilizador interativas dentro de um terminal. Embora ambas as ferramentas sejam semelhantes em termos de funcionalidade, a escolha entre uma ou outra pode depender das necessidades específicas do sistema e das preferências pessoais.
O Dialog é mais popular e amplamente documentado, enquanto o Whiptail é uma alternativa mais leve que pode ser preferida em sistemas onde a minimização do uso de recursos é crucial.
Neste artigo, cobrimos os conceitos básicos do Dialog e do Whiptail com exemplos práticos que lhe permitirão começar a criar os seus próprios scripts interativos. Quer precise de um menu simples, uma caixa de mensagem ou uma barra de progresso, estas ferramentas fornecer-lhe-ão as funcionalidades necessárias para melhorar a interação dos utilizadores com os seus scripts.
Lembre-se de que a chave para dominar estas ferramentas é a prática. Experimente os exemplos fornecidos, modifique-os para se adaptarem às suas necessidades e continue a explorar as múltiplas possibilidades que o Dialog e o Whiptail oferecem para tornar os seus scripts mais intuitivos e fáceis de usar.
Vídeo
Script do vídeo
A seguir, coloco dois scripts de exemplo de dois menus interativos:
Dialog
#!/bin/bash # Exemplo de menu usando o Dialog dialog --menu "Selecione uma opção:" 15 50 4 \ 1 "Ver informações do sistema" \ 2 "Mostrar uso do disco" \ 3 "Configurar rede" \ 4 "Sair" 2>selecao.txt # Ler a opção selecionada opcao=$(cat selecao.txt) case $opcao in 1) echo "Mostrando informações do sistema..." # Os comandos correspondentes iriam aqui ;; 2) echo "Mostrando uso do disco..." # Os comandos correspondentes iriam aqui ;; 3) echo "Configurando a rede..." # Os comandos correspondentes iriam aqui ;; 4) echo "Saindo..." exit 0 ;; *) echo "Opção inválida." ;; esac
O resultado seria:
Whiptail
#!/bin/bash # Exemplo de menu usando o Whiptail opcao=$(whiptail --title "Menu Principal" --menu "Selecione uma opção:" 15 50 4 \ "1" "Ver informações do sistema" \ "2" "Mostrar uso do disco" \ "3" "Configurar rede" \ "4" "Sair" 3>&1 1>&2 2>&3) # Verificar a opção selecionada case $opcao in 1) echo "Mostrando informações do sistema..." # Os comandos correspondentes iriam aqui ;; 2) echo "Mostrando uso do disco..." # Os comandos correspondentes iriam aqui ;; 3) echo "Configurando a rede..." # Os comandos correspondentes iriam aqui ;; 4) echo "Saindo..." exit 0 ;; *) echo "Opção inválida." ;; esac
Com o Whiptail, o resultado seria este:
Como se pode ver, os resultados são muito parecidos.
Referências e documentação
Para o Dialog e o Whiptail, podemos encontrar uma ampla documentação em https://invisible-island.net/dialog/dialog.html