Criando Scripts Interativos no Linux: Usando Dialog ou Whiptail

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:

dialog
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:

whiptail
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

Deixe um comentário