Você pode usar janelas da GUI, controles deslizantes, botões de rádio, barras de progresso e muito mais em seus scripts Bash. Aprenda como usar o zenity
kit de ferramentas e dar uma nova cara aos seus scripts Bash. Vamos mostrar como.
O script Bash é uma linguagem de programação poderosa e, como está embutido no shell Bash, está prontamente disponível para todos. É uma linguagem fácil de começar a programar. Por ser interpretada, você não precisa compilar seus scripts. Assim que editar o arquivo de script e torná-lo executável, você poderá executá-lo. Isso torna o ciclo de codificação, execução e depuração bastante eficiente.
Existem duas queixas principais que as pessoas têm com os scripts Bash, e a primeira é a velocidade. Como o shell Bash interpreta os comandos no script, eles não são executados tão rapidamente quanto o código compilado. No entanto, é como reclamar que um trator não é tão rápido quanto um carro; eles são feitos para coisas diferentes.
No entanto, existem dois tipos de velocidade. Muitas vezes você pode bater juntos um script rápido e usá-lo para executar uma tarefa muito mais rapidamente do que desenvolver uma solução em uma linguagem compilada, como C .
A segunda reclamação que as pessoas têm dos scripts Bash é a interface do usuário – é uma janela de terminal. Claro, às vezes a interface não importa. Se a única pessoa que usará o script for seu autor, a interface provavelmente não é tão importante. Nem importa para scripts que executam processamento em segundo plano e em lote. Normalmente, esses scripts não precisam de muita (se houver) interação do usuário.
Há ocasiões em que você precisa de algo um pouco mais intuitivo e moderno do que a janela do terminal. A maioria das pessoas está familiarizada com a interface gráfica do usuário (GUI). Para dar às pessoas uma experiência o mais simples possível, você deve criar e usar elementos GUI de seus scripts.
Índice
zenity
permite que você incorpore uma ampla variedade de elementos de interface gráfica em seus scripts Bash. É um kit de ferramentas poderoso que dá aos seus scripts uma sensação moderna e uma aparência contemporânea e familiar.
zenity
está pré-instalado nas distribuições Ubuntu, Fedora e Manjaro. Faz parte do GNOME. Se você usa o KDE, talvez queira fazer o check-out kdialog
, embora zenity
seja executado em qualquer ambiente de área de trabalho.
Os exemplos neste artigo mostram como criar as diferentes janelas de diálogo a partir da linha de comando, como capturar seus valores de retorno e seleções do usuário em variáveis e como usar as janelas de diálogo em scripts.
Terminamos com um pequeno aplicativo que faz uso de todos os três tipos de janelas de diálogo.
Uma janela de diálogo de calendário permite que alguém selecione uma data. Para criar um com, é zenity
necessário um único comando de duas palavras:
zenity --calendar
A janela de diálogo do calendário é exibida. Isso tem toda a funcionalidade que você esperaria de um selecionador de data padrão. Você pode alterar o mês e o ano e clicar em um dia para selecionar essa data. Por padrão, a data de hoje é destacada quando a janela é exibida.
Clique em “OK” para fechar a janela de diálogo e selecionar a data destacada. Clicar duas vezes em uma data faz a mesma coisa.
Se você não quiser fazer uma seleção de data, clique em “Cancelar”, pressione a tecla “Esc” no teclado ou feche a janela de diálogo.
No exemplo acima, 19 de agosto de 2019 está selecionado. Se o usuário clicar em “OK”, o calendário fecha e a data selecionada é impressa na janela do terminal.
Você pode ignorar a linha, “GTKDialog mapeado sem um pai temporário. Isso é desencorajado. ”
GTK significa GIMP Tool Kit , que é o kit de ferramentas usado para desenvolver a interface do GNOME . Foi originalmente desenvolvido pelos autores do GNU Image Manipulation Program ( GIMP ). GNU significa GNU’s Not Unix .
O motor GTK está alertando os autores de zenity
que eles usaram um componente GTK de uma maneira não padronizada.
Imprimir a data no terminal não faz muito para nós. Se vamos chamar este calendário de um de nossos scripts, precisamos capturar o valor de data selecionado para que possamos fazer algo útil com ele em nosso script. Também personalizaremos um pouco o calendário.
Usaremos as seguintes opções com o calendário. Todos eles devem ser usados com a bandeira de dois traços “-”:
Estamos usando uma variável chamada ChosenDate
para capturar a data retornada do calendário. E estamos usando echo $ChosenDate
para imprimir essa data na janela do terminal.
Sim, obtivemos o mesmo resultado do exemplo anterior, mas aqui temos a data selecionada armazenada em uma variável. No exemplo anterior, ele foi impresso e esquecido.
ChosenDate = $ (zenity - calendar --text "Escolha uma data" --title "How-To Geek Rota" --dia 1 - mês 9 - ano 2019); echo $ ChosenDate
Agora, o calendário exibe nosso prompt e o título da janela. A data é definida para a data de início escolhida, e não para a data de hoje.
Também podemos personalizar o formato da string de data retornada quando uma seleção é feita. A --date-format
opção deve ser seguida por um especificador de formato. Esta é uma string de tokens que definem os dados e formatos que devem ser incluídos na saída. Os tokens são os mesmos usados com a strftime()
função da linguagem C e há uma grande seleção deles.
Os tokens que estamos usando são:
ChosenDate = $ (zenity - calendar --text "Escolha uma data" --title "How-To Geek Rota" --date-format = "% A% d /% m /% y" --dia 1 - mês 9 - ano 2019); echo $ ChosenDate
Alguém seleciona uma data:
E a data é retornada usando nosso formato. Mostra o nome do dia da semana, seguido da data na ordem europeia: dia, mês, ano.
As janelas de diálogo de seleção de arquivo são bastante complexas. As pessoas podem navegar pelo sistema de arquivos, destacar um ou mais arquivos e clicar em “OK” para selecionar esses arquivos ou cancelar a seleção por completo.
zenity
fornece todas essas funcionalidades e muito mais. E é tão fácil de usar quanto a janela de diálogo do calendário.
As novas opções que vamos usar são:
zenity
que queremos usar uma janela de diálogo de seleção de arquivo.zenity --file-selection --tile "How-To Geek" --multiple --file-filter = '*. mm * .png * .page * .sh * .txt'
A janela de diálogo de seleção de arquivo é tão funcional quanto qualquer outra janela de seleção de arquivo.
O usuário pode navegar pelo sistema de arquivos e selecionar o arquivo de sua escolha.
Navegamos até um novo diretório e selecionamos um arquivo chamado “button_hybrid.png”.
Ao clicar em “OK”, a janela de diálogo de seleção de arquivo fecha e o nome do arquivo e o caminho são impressos na janela do terminal.
Se precisar usar o nome do arquivo em qualquer processamento posterior, você pode capturá-lo em uma variável, assim como fez para a data do calendário.
Se adicionarmos uma opção, podemos transformar a janela de diálogo de seleção de arquivo em uma janela de diálogo de salvamento de arquivo. A opção é --save
. Também vamos usar a --confirm-overwrite
opção. Isso solicita que a pessoa confirme que deseja sobrescrever um arquivo existente.
Resposta = $ (zenity --file-selection --save --confirm-overwrite); echo $ Response
A janela de diálogo para salvar o arquivo é exibida. Observe que há um campo de texto onde alguém pode digitar um nome de arquivo.
O usuário pode navegar até o local de sua escolha no sistema de arquivos, fornecer um nome para o arquivo ou clicar em um arquivo existente para substituí-lo.
No exemplo acima, o usuário destacou um arquivo existente.
Quando ele clica em “OK”, uma janela de diálogo de confirmação é exibida solicitando que ele confirme se deseja substituir o arquivo existente. Observe que o nome do arquivo aparece na caixa de diálogo de aviso. Esse é o tipo de atenção aos detalhes que confere zenity
sua aparência profissional.
Se não tivéssemos usado a --confirm-overwrite
opção, o arquivo teria sido substituído silenciosamente.
O nome do arquivo é armazenado na variável Response
, que é impressa na janela do terminal.
Com zenity
, incluindo janelas de diálogo de notificação elegantes em seus scripts é fácil. Existem janelas de diálogo de estoque que você pode chamar para fornecer informações, avisos, mensagens de erro e perguntas para o usuário.
Para criar uma janela de diálogo de mensagem de erro, use o seguinte comando:
zenity --error --width 300 --text "Permissão negada. Não é possível gravar no arquivo."
As novas opções que estamos usando são:
zenity
que queremos usar uma janela de diálogo de erro.A janela de diálogo de erro aparece na largura especificada. Ele usa o ícone de erro GTK padrão.
Para criar uma janela de diálogo de informações, use o seguinte comando:
zenity --info --width 300 --text "Atualização concluída. Clique em OK para continuar."
A nova opção que estamos usando é --info
, que informa zenity
para criar uma janela de diálogo de informações.
Para criar uma janela de diálogo de pergunta, use o seguinte comando:
zenity --question --width 300 --text "Gostaria de continuar?"; echo $?
A nova opção que estamos usando é --question
, que informa zenity
para criar uma janela de diálogo de pergunta.
O $?
é um parâmetro especial . Ele contém o valor de retorno do pipeline de primeiro plano executado mais recentemente. Em termos gerais, este é o valor do processo encerrado mais recentemente. Um valor zero significa “OK” e um valor de um ou mais significa “Cancelar”.
Esta é uma técnica geral que você pode aplicar a qualquer uma das zenity
janelas de diálogo. Ao verificar esse valor em seu script, você pode determinar se os dados retornados de uma janela de diálogo devem ser processados ou ignorados.
Clicamos em “Sim”, então o código de retorno é um zero indicando “OK”.
Para criar uma janela de diálogo de aviso, use o seguinte comando:
zenity --warning --title "Pouco espaço no disco rígido" --width 300 --text "Pode não haver espaço suficiente no disco rígido para salvar o backup."
A nova opção que estamos usando é --warning
, que informa zenity
para criar uma janela de diálogo de aviso.
A janela de diálogo de aviso é exibida. Não é uma pergunta, então só tem um botão.
Você pode usar a zenity
janela de diálogo de progresso para exibir uma barra de progresso que indica o quão perto da conclusão seu script está.
A barra de progresso é avançada de acordo com os valores que são canalizados para ela a partir do seu script. Para demonstrar o princípio, use o seguinte comando:
(para i em $ (seq 0 10 100); faça eco $ i; durma 1; feito)
O comando se divide assim:
seq
comando percorre uma sequência de 0 a 100, em etapas de 10.i
. Isso imprime na janela do terminal.sleep 1
comando.Podemos usar isso com a zenity
janela de diálogo de progresso para demonstrar a barra de progresso. Observe que estamos canalizando a saída do comando anterior parazenity:
(para i em $ (seq 0 10 100); faça eco $ i; dormir 1; concluído) | zenity --progress --title "How-To Geek" - fechamento automático
As novas opções que estamos usando são:
zenity
que queremos usar uma janela de diálogo de progresso.A janela de diálogo de progresso é exibida e a barra avança para 100 por cento, parando por um segundo entre cada etapa.
Podemos usar esse conceito de canalizar valores zenity
para incluir a janela de diálogo de progresso em um script.
Insira este texto em um editor e salve-o como “progress.sh”.
! / bin / bash function work-list () { echo "# Primeiro item de trabalho" echo "25" dormir 1 echo "# segundo item de trabalho" echo "50" dormir 1 echo "# Terceiro item de trabalho" echo "75" dormir 1 echo "# Último item de trabalho" echo "100" dormir 1 } lista de trabalho | zenity --progress --title "How-To Geek" --auto-close saída 0
Aqui está uma análise do script:
work-list
. É aqui que você coloca seus comandos e instruções para realizar um trabalho real. Substitua cada um dos sleep 1
comandos pelos reais.zenity
aceita as echo "# ..."
linhas e as exibe na janela de diálogo de progresso. Altere o texto dessas linhas, para que passem mensagens informativas ao usuário.echo
linhas que contêm números, como echo "25"
, também são aceitas zenity
e definem o valor da barra de progresso.zenity
.Use este comando para tornar o script executável:
chmod + x progress.sh
Use este comando para executar o script:
./progress.sh
O script é executado e a mensagem de texto muda conforme cada fase do script é executada. A barra de progresso se move em etapas em direção a 100 por cento.
A janela de diálogo de escala permite que alguém mova um controle deslizante para escolher um valor numérico. Isso significa que ela não pode inserir um valor muito alto ou baixo.
As novas opções que estamos usando são:
zenity
que queremos usar uma janela de diálogo de escala.Este é o comando que estamos usando:
Response = $ (zenity --scale --title "How-To Geek" --text "Selecione a ampliação." --Min-value = 0 --max-value = 30 --step = 3 --value15); echo $ Response
A janela de diálogo do controle deslizante aparece com o controle deslizante definido como 15.
O usuário pode mover o controle deslizante para selecionar um novo valor.
Quando ela clica em “OK”, o valor é transferido para a variável Response
e impresso na janela do terminal.
A janela de diálogo de entrada permite que alguém insira texto.
As novas opções que estamos usando são:
zenity
que queremos usar uma janela de diálogo de entrada.O comando completo tem a seguinte aparência:
Response = $ (zenity --entry --text "Digite seu termo de pesquisa" --title "Howe-To Geek" --entry-text = ""); echo $ Response
Uma janela de diálogo simples é exibida, contendo um campo de entrada de texto.
Alguém pode digitar e editar o texto.
Quando ele clica em “OK”, o valor que ele digitou é atribuído à variável Resposta. Usamos echo para imprimir o valor da variável na janela do terminal.
Vamos juntar essas técnicas e criar um script funcional. O script executará uma varredura de informações de hardware e apresentará os resultados ao usuário em uma janela de texto de rolagem. Ela pode escolher um tipo de digitalização longo ou curto.
Para este script, usaremos três tipos de janelas de diálogo, duas das quais são novas para nós:
Insira este texto em um editor e salve-o como “hardware-info.sh”.
#! / bin / bash # Exibir lista de hardware para este computador TempFile = $ (mktemp) ListType = `zenity --width = 400 --height = 275 --list --radiolist \ --title 'Verificação de Hardware' \ --text 'Selecione o tipo de verificação:' \ --column 'Selecionar' \ --column 'Scan Type' TRUE "Short" FALSE "Long" ` se [[$? -eq 1]]; então # eles pressionaram Cancelar ou fecharam a janela de diálogo zenity --error --title = "Escaneamento recusado" --width = 200 \ --text = "Verificação de hardware ignorada" saída 1 elif [$ ListType == "Short"]; então # selecionaram o botão de opção curto Bandeira = "- curto" outro # selecionaram o botão de opção longo Bandeira = "" fi # pesquise informações de hardware com o valor apropriado em $ Flag hwinfo $ Bandeira | tee> (zenity --width = 200 --height = 100 \ --title = "Coletando informações" --progress \ --pulsate --text = "Verificando hardware ..." \ --auto-kill --auto-close)> $ {TempFile} # Exibe as informações do hardware em uma janela de rolagem zenity --width = 800 --height = 600 \ --title "Detalhes de Hardware" \ --text-info --filename = "$ {TempFile}" saída 0
Use este comando para torná-lo executável:
chmod + x hardware-info.sh
Este script cria um arquivo temporário e o nome do arquivo é mantido na variável TempFile:
TempFile = $ (mktemp)
O script usa a --list
opção de criar uma zenity
janela de diálogo chamada janela de diálogo de lista. Os caracteres “\” no final das linhas dizem ao script para tratá-los como uma longa linha que está enrolada. Aqui está o processo:
--radiolist
opção faz com que a primeira coluna seja uma coluna de botões de opção.ListType
.ListType = `zenity --width = 400 --height = 275 --list --radiolist \ --title 'Verificação de Hardware' \ --text 'Selecione o tipo de verificação:' \ --column 'Selecionar' \ --column 'Scan Type' TRUE "Short" FALSE "Long" `
Se o usuário pressionar “Cancelar”, não precisamos verificar o valor ListType,
, podemos simplesmente sair. Se ele pressionar “OK”, precisamos descobrir se ele selecionou o botão de opção “Curto” ou “Longo”:
$?
é igual a zero se o usuário pressionou “OK”. É igual a um se ele pressionou “Cancelar” ou fechou a janela.ListType
variável.ListType
variável tiver o valor “Short”, o script definirá uma variável chamada Flag
igual a “–short”.ListType
variável não possuir o valor “Curto”, ela deve conter o valor “Longo”. O script define uma variável chamada Flag
igual a “”, que é uma string vazia.Flag
variável na próxima seção.se [[$? -eq 1]]; então # eles pressionaram Cancelar ou fecharam a janela de diálogo zenity --error --title = "Análise recusada" --width = 200 \ --text = "Análise de hardware ignorada" saída 1 elif [$ ListType == "Short"]; então # selecionaram o botão de opção curto Bandeira = "- curto" outro # selecionaram o botão de opção longo Bandeira = "" fi
Agora que o script sabe qual tipo de varredura o usuário deseja, podemos realizar a varredura das informações de hardware:
hwinfo
comando e passa o valor na Flag
variável.Flag
contiver “–short,” o hwinfo
comando executa uma verificação curta. Se o valor de Flag
for “”, nada passa para hwinfo
e uma varredura longa padrão é executada.hwinfo
para tee
. tee
envia a saída para zenity
e o TempFile
.hwinfo
comando produzirá, portanto, não pode definir a barra de progresso para avançar corretamente para 100 por cento. A --pulsate
opção faz com que a caixa de diálogo de progresso exiba um indicador móvel. Isso informa ao usuário que algo está acontecendo e ele deve esperar.--auto-kill
opção termina o script se alguém clicar em “Cancelar”.--auto-close
opção faz com que a caixa de diálogo de progresso seja fechada automaticamente quando o processo que está monitorando for concluído.# pesquise informações de hardware com o valor apropriado em $ Flag hwinfo $ Bandeira | tee> (zenity --width = 200 --height = 100 \ --title = "Coletando informações" --progress \ --pulsate --text = "Verificando hardware ..." \ --auto-kill --auto-close)> $ {TempFile}
Quando a hwinfo
varredura é concluída, o script chama zenity
para criar uma janela de diálogo de informações de texto com a --text-info
opção. A janela de diálogo de informações de texto exibe o conteúdo do TempFile
arquivo:
--flename
opção é usada para ler o conteúdo do arquivo mantido na TempFIle
variável.# Exibe as informações do hardware em uma janela de rolagem zenity --width = 800 --height = 600 \ --title "Detalhes de Hardware" \ --text-info --filename = "$ {TempFile}"
Quando o usuário fecha a janela de diálogo de informações de texto, o script sai.
saída 0
Vamos ligar e dar uma olhada.
./hardware-info.sh
A caixa de listagem é exibida. A opção “Curto” é selecionada por padrão.
Vamos selecionar “Longo” e depois clicar em “OK”.
A janela de progresso aparece com um indicador deslizante. Ele permanece na tela até que a varredura de hardware seja concluída.
Quando a varredura de hardware for concluída, a janela de diálogo de informações de texto aparecerá com os detalhes da varredura.
Clique OK.”
Mesmo um maníaco por linha de comando obstinado tem que admitir que algumas janelas de diálogo da GUI podem dar a um humilde script Bash um toque profissional.
Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…
Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…
A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…
A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…
O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…
Para ver suas fotos mais de perto ou para uma edição precisa , você pode…