Shell Scripting – Criando caixas de diálogo TUI com dialog

Programação em Shell Scripting no Linux – Criando caixas de diálogo TUI com dialog

O pacote dialog é uma ferramenta criada originalmente por Savio Lam. Este pacote permite criar caixas de diálogo padrão em janelas em um ambiente de texto, usando códigos de controle de escape ANSI.

Podemos incorporar estas caixas de diálogo em nossos script do shell para que haja interação com os usuários.

O pacote dialog não é instalado por padrão em muitas distribuições Linux. Se ele não estiver presente em seu sistema, instale-o com os comandos a seguir:

Em sistemas Debian / Ubuntu:

# apt-get install dialog

Em sistemas Red Hat / Fedora / CentOS:

# yum install dialog

O comando dialog utiliza parâmetros de linha de comando para determinar que tipo de widget de janela deve ser criada. Um widget é um tipo de elemento de janela. Podemos ver na tabela a seguir alguns dos tipos de widgets suportados pelo pacote dialog:

Widget

Descrição

calendar

Fornece um calendário que permite selecionar datas

checklist

Mostra entradas múltiplas onde cada entrada pode ser ligada ou desligada

form

Permite construir um formulário com labels e campos de texto para serem preenchidos

fselect

Fornece uma janela de seleção de arquivos

gauge

Mostra uma barra de progresso

infobox

Mostra uma mensagem sem esperar por uma resposta

inputmenu

Fornece um menu editável

menu

Mostra uma lista de seleções para escolha

msgbox

Mostra uma mensagem e pede que o usuário pressione um botão OK

passwordbox

Mostra uma caixa de texto simples que esconde o texto digitado

radiolist

Fornece um grupo de itens de menu onde apenas um item pode ser selecionado

tailbox

Mostra o texto de um arquivo em uma janela com rolagem usando o comando tail

textbox

Mostra o conteúdo de um arquivo em uma janela com rolagem

timebox

Fornece uma janela para selecionarmos uma hora, minuto e segundo

yesno

Fornece uma mensagem simples com botões Yes e No.

Para especificarmos um widget na linha de comandos, usamos a seguinte sintaxe:

dialog --widget parâmetros

Cada widget fornece saída em duas formas:

  • usando o erro padrão STDERR
  • usando o código de status de saída

O código de status do comando dialog determina o botão selecionado pelo usuário. Caso o botão selecionado seja Yes ou OK, o status de saída retornado será 0; se um botão Cancel ou No for selecionado, o comando dialog retornará um status de saída igual a 1. E caso o usuário pressione a tecla ESC, o status de saída será igual a 255. Desta forma, podemos usar a variável padrão $? para determinar qual ação foi selecionada na caixa de diálogo.

Agora, caso o widget retorne dados, como uma palavra ou a seleção de um menu, o comando dialog enviará esses dados para STDERR. Assim podemos usar as técnicas de redirecionamento de saída para redirecionar os dados para STDOUT ou qualquer outro arquivo, como no exemplo abaixo:

$ dialog --inputbox “Digite seu nome:” 10 20 2>nome.txt

Este comando redireciona o texto digitado na caixa de texto para o arquivo nome.txt. Os números 10 20 indicam o tamanho da janela, sendo no caso 10 linhas por 20 colunas.

Vamos estudar agora exemplos de uso dos diversos widgets:

1. Caixa de mensagens – msgbox

Mostra uma mensagem simples em uma janela e espera o usuário pressiona um botão OK para desaparecer.

Sintaxe:

dialog --title título_caixa --msgbox texto_a_mostrar altura largura

Exemplo:

$ dialog --title “Caixa de Exemplo” --msgbox “Testando uma msgbox” 10 35

Caixas de diálogo com dialog em shell scripting no linux

2. Widget yesno

O widget yesno permite que o usuário esponda a uma questão do tipo Sim / Não mostrada na tela. O status de saída do comando dialog depende de qual botão é escolhido. Se for o botão No, o status de saída será 1; se for o botão Yes, o status de saída será 0.

Exemplo:

$ dialog --title “Caixa yesno” --yesno “Escolha Sim ou Não” 10 25

Caixa de diálogo yes no no linux

3. A caixa inputbox

A caixa inputbox fornece uma caixa de texto simples para que o usuário entre com uma string qualquer. O comando dialog envia o valor do texto digitado para o STDERR. Podemos então redirecionar esse valor para obtermos a informação digitada, o que faremos com o parâmetro –stdout.

Exemplo:

$ nome=$(dialog --inputbox “Digite seu nome” 10 25 --stdout)
$ echo $?
$ echo $nome

Caixa input box em shell script

4. O widget textbox

Com o widget textbox podemos mostrar uma grande quantidade de informações em uma janela. Ele produz uma janela com rolagem que contém o texto proveniente de um arquivo especificado.

Exemplo:

$ dialog --textbox /etc/group 20 20

widget textbox em shell scripting

5. O widget menu

O widget menu permite criar um menu de itens selecionáveis a partir de uma tag de seleção e um texto descritivo de cada item

Exemplo:

$ sistema=$(dialog --menu “Escolha o sistema” 20 35 15 \
1 “Linux” \
2 “BSD” \
3 “Solaris” \
4 “ Android” --stdout)
$ echo $sistema

Widget menu em shell scripting

No exemplo o caractere \ é utilizado para que possamos continuar a digitação do comando na linha abaixo. Capturamos o valor escolhido na variável sistema, e em seguida exibimos seu valor no console com o comando echo.

6. Widget calendar

Usamos o widget calendar para que o usuário possa selecionar uma data em uma janela gráfica.

Exemplo:

$ data=$(dialog --calendar “Escolha a data” 0 0 --stdout)
$ echo $data

widget calendar em shell scripting no linux

Usamos a opção –stdout para redirecionar a informação selecionada para a saída padrão, onde será atribuída à variável data.

7. Trabalhando com caixa de informações – infobox:

O infobox é um widget bem simples, que vostra uma mensagem sem esperar por uma resposta do usuário.

Exemplo:

$ dialog --title “Sucesso” --infobox “Operação Concluída” 5 35; sleep 4; clear

caixa de diálogo infobox em shell scripting

Usamos o comando sleep 4 para que a janela permaneça por 4 segundos antes de encerrar o widget.

8. Usando um checklist

Um checklist permite apresentar um conjunto de itens dos quais o usuário pode selecionar quantos desejar usando a barra de espaços do teclado.

Exemplo:

$ itens=$(dialog --checklist “Escolha a cor:” 15 30 4 \
“Verde” “” OFF \
“Azul” “” OFF \
“Amarelo” “” ON \
“Preto” “” OFF --stdout)
$ echo $itens

widget checklist em shell scripting no linux

Os itens pré-selecionados devem usar a palavra ON, e os não selecionados automaticamente usam a palavra OFF. Também devemos indicar o número de itens logo após as dimensões da janela (em nosso caso, 4 itens).

9. Usando um radiolist

O radiolist é similar ao checklist, com a diferença de que só é possível escolher um dos itens apresentados.

Exemplo:

$ itens=$(dialog --radiolist “Escolha a cor:” 15 30 4 \
“Verde” “” OFF \
“Azul” “” OFF \
“Amarelo” “” ON \
“Preto” “” OFF --stdout)
$ echo $itens

widget radiolist em shell script

10. Usando um timebox

Vamos ver agora o uso básico de um widget timebox

Exemplo

$ hora=$(dialog --stdout --title “Relógio” --timebox “Escolha o horário:” 0 0)
$ echo “ A hora escolhida foi $hora”

widget timebox shell scripting

É isso aí pessoal! Agora é só caprichar em seus scripts usando essa ferramenta excelente. E não deixem de conferir nosso artigo Criando caixas de diálogo via Shell Scripting usando a ferramenta whiptail, além de assistir ao nosso vídeo sobre a ferramenta dialog em Shell Scripting:

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

2 Comentários em Shell Scripting – Criando caixas de diálogo TUI com dialog

  1. Marcos Felipe Da Silva Jardim // 19/08/2015 em 6:51 // Responder

    Bom dia, antes de tudo vou parabenizar pelo seu canal no youtube e pelo site, acompanho há 2 anos seu trabalho e tem me ajudado muito nessa caminhada no Linux. No final de uma video aula de Shell Scripting, especificamente a aula sobre dialog, você mencionou que teria exemplos de como utilizar mais opções aqui no seu site. Você pode por favor me indicar o local correto ? Desde já agradeço.

  2. Notei que digitar o comando no terminal e colocar a saída –stdout, funciona quando vou ver o valor da variável. Porém quando coloco o script dentro de um arquivo, ao executa-lo e depois verificado a variável a saída não tem valor. Porque isso acontece?

Escreva um comentário

Seu e-mail não será divulgado


*