Usando o dialog
Piter PUNK
Muitas vezes, depois de fazer um programa em shell, você percebe que
seria interessante produzir uma interface melhor com o seu usuário,
usando menus, caixas de texto, etc... É nessa hora que surge o dialog!
1. Introdução
O dialog é um programa simples de usar que oferece a você vários
recursos de "gráficos" para incrementar os seus
shell scripts. Neste artigo iremos "mostrar" um pouco do dialog, mas ele
não se resume apenas ao que escrevemos aqui. Ele possui muitas outras opções
e funcionalidades, que poderão ser melhor exploradas
após uma boa olhada no manual.
2. Começando
A estrutura de um comando no dialog é bem simples:
dialog --tipo-de-caixa "Texto da caixa"
Dependendo do tipo-de-caixa, são necessárias várias outras opções.
Vamos brincar com uma --msgbox, onde você pode colocar informações
do seu programa antes de executá-lo...
dialog --msgbox "\
Este é um programa muito bem feito \
e especial, e depois de clicar em \
OK você entrará no maravilhoso mundo \
do meu programa wonder-ultra-plus" 0 0
Irá aparecer uma caixa centralizada contendo o texto que você digitou
e um botão de OK. O "0 0" do fim diz para o dialog autodimensionar
a janela, mas você pode força-lo a usar o tamanho que quiser trocando
os números, o primeiro é a altura e o segundo a largura da caixa.
3. Incrementando
Vamos agora melhorar um pouco mais a aparência da nossa caixa de
mensagens, vamos colocar um título na caixa:
dialog --title "Apresentação" --msgbox "\
Este é um programa muito bem feito \
e especial, e depois de clicar em \
OK você entrará no maravilhoso mundo \
do meu programa wonder-ultra-plus" 0 0
Já ficou melhor não é? Agora, para ficar com um visual ainda mais
profissional vamos colocar um título no fundo, com o nome do nosso
programa:
dialog --backtitle "MeuPrograma 0.1" --title "Apresentação" ...
Onde estão os ... é para colocar o resto do texto dos exemplos anteriores.
Ah! Estas opções --backtitle e --title funcionam em todas as outras caixas
do dialog.
4. Outras caixas
Agora que já estamos craques em desenhar caixas de mensagem e em um
design legal, vamos dar uma verificada nas outras caixas que o dialog
nos oferece:
4.1. Sim/Não
Para perguntas simples, nada como a caixa --yesno, onde
você coloca uma mensagem e o usuário responde com "sim"
ou "não". Por exemplo:
dialog --yesno "Você deseja apagar tudo?" 0 0
Um detalhe bem interessante, é saber o que o seu usuário
respondeu, no caso do -yesno, ele devolve "0" para sim
(sucesso) e "1" para não (fracasso). O nosso programinha
ficaria assim:
dialog --yesno "Você deseja apagar tudo?" 0 0
if [ $? = 0 ]; then
dialog --infobox "Apagando tudo..." 0 0
else
dialog --infobox "A vida continua..." 0 0
fi
Com isso aprendemos a pegar os resultados do --yesno e de
quebra aprendemos a usar uma --infobox -;)
4.2. Menu
Este tipo de caixa vai apresentar um menu (!!!). Ele é
um pouco mais complicado que os outros que vimos até
agora, tem muito mais parâmetros:
dialog --menu "Selecione uma opção do menu" 0 0 3 \
1 "Opção 1" \
2 "Opção 2" \
3 "Opção 3"
A primeira alteração visível, é que o tamanho possui 3
argumentos ao invés de dois, os dois primeiros são altura
e largura, e o último é o tamanho da "lista" de opções.
Se você colocar o tamanho da lista menor que a quantidade
de opções, você poderá "rolar" pelas opções (irá aparecer
um indicador "v(+)" ou "^(+)" indicando que existem mais
opções abaixo ou acima
Outra alteração são as próprias opções! Você pode colocar
um "atalho" e depois o texto da opção.
Para pegar a saída do "OK" e do "Cancel", use o mesmo processo
que utilizamos para pegar a saída do --yesno, "0" para OK e
"1" para "Cancel"
E, para pegar a opção selecionada, existem duas opções:
- usar um arquivo temporário com a opção e depois ler do arquivo
o que o usuário escolheu
- Passar a saída diretamente para uma variável
Para fazer o primeiro, é bem simples... apenas coloque no final
do comando dialog um 2>/tmp/arquivotemporario, como abaixo:
dialog --menu "Selecione uma opção do menu" 0 0 3 \
...
3 "Opção 3" 2>/tmp/arquivotemporario
Este método é fácil mas é um pouco desagradável depender
de um arquivo externo. É preferível utilizar a segunda opção:
OPCAO=`dialog --stdout --menu "Selecione uma opção...\
...
3 "Opção 3"`
Logo depois de executar o dialog, a saída dele estará na
variável OPCAO, bem mais prático.
4.3. Radiolist
Podemos dizer que este é um "modelo" diferente de Menu,
serão apresentadas várias opções para você selecionar,
e apenas uma delas pode estar selecionada:
dialog --radiolist "Selecione uma opção do menu" 0 0 3 \
1 "Opção 1" ON \
2 "Opção 2" OFF \
3 "Opção 3" OFF
Lembre que apenas uma das opções pode estar ativa, repare
que também já deixamos uma opção selecionada "por default"
Para pegar a opção selecionada, basta utilizar os métodos
que vimos na caixa de Menu.
4.4. Checklist
Esta é uma parente da Radiolist, a grande diferença é
que podemos selecionar mais de uma opção:
dialog --checklist "O que pretende apagar?" 0 40 3 \
usuarios "Todos os usuários" ON \
programas "Todos os programas" ON \
tudo "Tudo mesmo..." OFF
A saída desta caixa é o nome das várias opções selecionadas,
cada uma delas entre aspas. Isso atrapalha um pouco para
trabalhar com essas opções. Uma boa idéia é utilizar o
--separate-output isso fará com que a saída seja dada uma
opção por linha.
4.5. InputBox
Este é o tipo de caixa que você vai escolher quando for
pedir para o seu usuário escrever algo. Para coletar
o que o seu usuário digitou, utilize os métodos que já
vimos em outros exemplos:
dialog --inputbox "Escreva aqui alguma bobagem" 0 0
4.6. Mais Caixas
Mostrei apenas as Caixas que acho mais úteis, mas existem várias outras
à mais se você quiser:
--calendar |
Mostra um calendário para você selecionar a data |
--fselect |
Uma caixa de seleção de arquivos |
--gauge |
caixa para ver o andamento (em porcentagem) de algo |
--textbox |
Mostra o conteúdo de um arquivo texto |
--timebox |
Para você selecionar as horas |
--inputmenu |
Igual ao menu, mas você pode alterar as opções, muito bom
para corrigir algumas entradas |
E além destas ainda existem outras, dê aquela olhadinha na saída do
comando dialog sem argumentos e na manpage dele.
5. Conclusão
O dialog é uma ferramenta poderosa para o desenho de interfaces com o
usuário e ainda tem uma vantagem adicional, existem vários clones dele
para o modo gráfico, como o Xdialog ou o gdialog e normalmente eles seguem
a mesma sintaxe do dialog. Seus scripts agora com janelinhas, quem diria -;)
Talvez o único "contra" do dialog seja as suas linhas de comando enormes,
mas sabendo usar corretamente o \ para quebrá-las em pedacinhos ele se
torna perfeitamente gerenciável.
Qualquer dúvida, crítica ou sugestão sobre este artigo:
piterpk@terra.com.br
|