O programa dialog permite a criação de janelas em prompts, permitindo a criação de interfaces simples para a interação com o usuário. Vocẽ pode instalar o programa usando o instalador de pacotes do sistema operacional.
Em sistemas Debian, ou baseados em Debian, o programa whiptail pode ser usado para substituir o comando dialog. O whiptail pode já estar instalado.
Você pode ler o manual do dialog, usando o comando:
man dialog
Mas, caso queira apenas um resumo de como montar uma determinada janela, use o comando
dialog -h
Por padrão, sempre usarei o parâmetro --stdout para jogar os retornos em tela e facilitando o uso dos dados dentro de scripts
o Build list te permite adicionar/remover itens de uma determinada lista. Você pode definir quais itens estarão selecionados ou não, e quando o usuário confirmar as seleções, será retornada a lista de elementos selecionados.
OBS: Você pode usar os caracteres ^ e $ para navegar para o primeiro e segundo menu, respectivamente. Ou, adicione o parâmetro --visit-items para navegar com TAB e com as setas.
No exemplo abaixo, você verá uma lista de itens para montar um sanduíche:
#!/bin/bash
dialog --stdout --visit-items --buildlist "Escolha alguns dos itens:" 20 50 5 \
t1 "Hamburguer" off \
t2 "Segundo hamburguer" on \
t3 "Alface" off \
t4 "Queijo" on \
t5 "Molho especial" on \
t6 "Cebola" off \
t7 "Picles" on \
t8 "Pão, com gergilim" off
# Amo muito tudo isso
Vamos decompor o programa acima:
- As barras no final de cada linha são usadas para quebrar uma linha de comando em várias (facilita a leitura). Elas não fazem parte do comando
- O comando dialog --stdout --visit-items --buildlist "Escolha alguns dos itens:" é para montar uma buildlist, usando o std como saída, e podendo acessar os itens com as setas.
- Os três valores passados(20,50,5) identificam altura,largra e altura da lista, respectivamente.
- t1 "Hamburguer" e off identificam a tag a ser retornada, a descrição do item, e se ele está selecionado.
Quando um item está marcado como on, ele ficará na lista da direita, pois já está selecionado. Para adicionar/remover itens das listas utilize a barra de espaço.
As tag selecionadas serão retornadas quando o usuário der enter no botão OK.
O calendário é uma opção fácil para o usuário entrar com uma data. a forma mais simples de uso, passamos apenas um título, altura e largura. O próprio dialog se encarrega de deixar o dia selecionado como o dia atual:
dialog --calendar "Escolha uma data" 0 0
Você também pode passar os dados de dia, mês e ano para que o comando defina a data incial do calendário:
dialog --calendar "Escolha uma data" 0 0 22 12 1992
Como o nome já diz, este tipo de janela monta um checklist para o usuário marcar as opções que desejar. Quando confirmado, os valores serão retornados em formato de lista:
dialog --checklist 20 50 5 \
t1 "item 1" off \
t2 "item 2" on
Perceba que a sintaxe é muito parecida com o buildlist, por exemplo. Sua função é muito parecida, apenas sua forma de apresentação para o usuário é diferente.
esta janela é usada para escolher um diretório. o usuário pode colocar / após o diretório escolhido para acessar o diretório e ver seus subdiretórios. No exemplo abaixo vamos passar o diretório / como diretório para iniciar a consulta:
dialog --dselect / 20 50
o editbox abre um arquivo e permite que o usuário edite seus dados. Quando clicado em OK, o conteúdo do arquivo é jogado na tela, sem alterar o arquivo original.
Para este exemplo, crie um arquivo contendo algumas palavras e salve com o nome teste.txt em seguida, execute o comando:
dialog --editbox teste.txt 0 0
O form gera um formulário para o usuário preencher. Por ser mais complexos, vamos ver o exemplo e depois analisar seus parâmetros:
#!/bin/bash
dialog --form "preencha os dados:" 25 50 10 \
"Nome:" 1 1 "Fernando Crozetta" 1 10 30 0 \
"Telefone:" 2 1 "912345678" 2 10 10 0 \
"email:" 3 1 "fernando@czetta.com" 3 10 20 0
Os primeiros quatro parâmetros indicam um texto a ser mostrado, a altura, largura e altura do formulário.
Depois, para cada item do formulário:
- Descrição do campos
- Altura no formulário
- Início do texto no formulário
- valor padrão (pode ser "", para indicar vazio)
- Altura do campo de resposta, dentro do formulário
- Coluna de início do campo de resposta
- Tamanho do campo de resposta
- Tamanho do texto dentro do campo de resposta. (se for 0, é definido como o tamanho do campo)
O comando fselect serve para selecionar um arquivo do sistema. Seu funcionamento é igual ao do dselect:
dialog --fselect / 25 50
Este widget é usado para mostrar a porcentagem em uma barra de progresso.
Como ele mostra apenas um valor, você precisa atualizar os dados a cada passo.
Um dos exemplos mais comuns de se encontrar, é:
#!/bin/bash
for i in {0..100..25}; do
sleep 0.06
echo "$i" | dialog --gauge "aguarde" 7 70 0
done
A janela de infobox mostra uma jnela com a informação, e sai sem pedir confirmação do usuário.
dialog --infobox "Hello world" 25 50
O inputbox serve para solicitar uma string para o usuário:
dialog --iputbox "Digite seu nome" 25 50
Podemos também passar mais um argumento, que será usado como valor default:
dialog --iputbox "Digite seu nome" 25 50 "Fernando Crozetta"
input menu é um menu que permite a edição de um campo. Este widget cria um botão chamado renomear, que permite a alteração de um campo. Quando o usuário finalizar, será mostrado RENAMED campo valor.
dialog --inputmenu "teste" 25 50 10 nome "nome1" fone "" email "fernando@czetta.com"
A opção de menu permite ao usuário escolher um item de uma lista.
dialog --menu "menu" 25 50 10 t1 "opção 1" t2 "opção 2"
Este widget mostra uma janela com informações, igual ao infobox. Pórém, será mostrado um botão de OK para que o usuário confirme.
dialog --msgbox "hello world" 25 50
O passwordbox funciona como um input, mas ele não mostra o que foi digitado.
dialog --passwordbox "senha:" 25 50
Você também pode adicionar a opção --insecure que vai mostrar um asterisco para cada caracter digitado:
dialog --insecure --passwordbox "senha:" 25 50
Este dialog irá mostrar um contador de tempo na parte inferior da janela, com uma contagem regressiva. Passe além do texto,altura e largura, um valor de tempo, em segundos. No exemplo o tempo é 2:
dialog --pause "aguarde" 0 0 2
Este widget mostra o resultado de um comando na tela, na forma de um msgbox:
dialog --prgbox "echo '2+2' | bc" 0 0
Radiolist mostra uma lista de opções e permite que o usuário escolha apenas um. Quando outra opção for marcada, todas as outras serão desmarcadas.
dialog --radiolist "Opções" 25 50 10 \
t1 "opção 1" on \
t2 "opção 2" off \
t3 "opção 3" off
Este widget mostra uma barra de progresso para o usuário escolher um valor. as setas para cima e para baixo diminuem e aumentam o valor. Além da altura e largura, passar o valor mínimo, máximo e default. No exemplo, o valor mínimo é 1, o máximo é 100, e o default é 50:
dialog --rangebox "escolha um valor" 0 0 1 100 50
Este widget carrega o conteúdo de um arquivo e mostra na tela, como um msgbox
dialog --textbox teste.txt 0 0
Carrega uma janela para escolha de horário. Por padrão, carrega o horário atual do sistema:
dialog --timebox 0 0
Mas pode ser chamado passando um horário específico (Horas minutos e segundos):
dialog --timebox 0 0 12 23 34
tree view mostra os dados seguinto uma hierarquia. para simplificar a compreensão, o script de exemplo possui indentação nos itens que forem filhos dos itens superiores:
#!/bin/bash
dialog --treeview "tree view" 25 50 10 \
t1 "item 1.0" On 0 \
t2 "item 1.1" OFF 1 \
t3 "item 1.2" OFF 1 \
t4 "item 1.3" off 1 \
t5 "item 2.0" off 0 \
t6 "item 2.1.0" off 1 \
t7 "item 2.1.1" off 2 \
t8 "item 2.1.2" off 2 \
t9 "item 2.2" off 1 \
t10 "item2.3" off 1 \
Os parâmetros no ínicio são texto, altura, largura, altura da lista.
Para cada item, na ordem:
- tag do item
- descrição do item
- status(on/off) para saber se está marcado. Apenas um por treeview pode ser on.
- nível da hierarquia (começando em zero para os itens de raiz)
O yesno abre um ajanela para que o usuário possa confirmar/cancelar.
a sua forma mais simples:
dialog --yesno "deseja sair?" 0 0