Header Ads

Como adicionar uma GUI aos scripts de shell do Linux

Você pode usar janelas de GUI, controles deslizantes, botões de opção, barras de progresso e muito mais em seus scripts Bash. Aprenda a usar o kit de ferramentas do zenity e dê a seus scripts do Bash um facelift. Vamos mostrar-lhe como.

O script Bash é uma poderosa linguagem de programação e, por estar integrado ao shell Bash, está disponível para todos. É uma linguagem fácil para começar a programar. Como isso é interpretado, 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 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, isso é como reclamar que um trator não é tão rápido quanto um carro; eles são feitos para coisas diferentes.

Existem dois tipos de velocidade, no entanto. Muitas vezes você pode criar 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 com scripts Bash é a interface do usuário - é uma janela de terminal. Claro, às vezes a interface não importa. Se a única pessoa que vai usar o script é o autor, a interface provavelmente não é importante. Também não importa para scripts que executam processamento de tipo de plano de fundo e lote. Normalmente, esses scripts não precisam de muita (ou nenhuma) interação com o 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 uma interface gráfica de usuário (GUI). Para proporcionar às pessoas uma experiência que seja o mais simples possível, você precisa criar e usar elementos GUI dos seus scripts.

O aplicativo zenity

O

zenity permite que você incorpore uma ampla gama de elementos de interface gráfica em seus scripts Bash. É um poderoso kit de ferramentas que dá aos seus scripts uma sensação moderna e uma aparência contemporânea e familiar.

O zenity é pré-instalado nas distribuições Ubuntu, Fedora e Manjaro. Faz parte do GNOME. Se você usa o KDE, você pode querer dar uma olhada no kdialog, embora o zenity seja executado em qualquer ambiente de desktop.

Os exemplos neste artigo mostram como criar as diferentes janelas de diálogo a partir da linha de comando, para capturar seus valores de retorno e seleções de usuário em variáveis, e como usar as janelas de diálogo em scripts.

Nós terminamos com um pequeno aplicativo que faz uso de todos os três tipos de janelas de diálogo. h2] A janela de diálogo do calendário

Uma janela de diálogo do calendário permite que alguém selecione uma data. Para criar um com zenity, é necessário um único comando de duas palavras:

 zenidade --calendar 

 

A janela de diálogo do calendário é exibida. Isso tem todas as funcionalidades que você espera 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 fechará e a data selecionada será 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 concebido pelos autores do GNU Image Manipulation Program (GIMP). GNU significa GNU's Not Unix.

O mecanismo GTK alerta os autores do zenity de que eles usaram um componente GTK de maneira não padrão.

Capturando o valor de data

]

Imprimir a data no terminal não faz muito por nós. Se vamos chamar este calendário de um dos nossos scripts, precisamos capturar o valor de data selecionado para que possamos fazer algo útil com ele em nosso script. Também personalizaremos o calendário um pouco.

Usaremos as seguintes opções com o calendário. Todos eles devem ser usados ​​com o sinalizador “-” de dois toques:

  • –text: especifica uma seqüência de texto a ser exibida no calendário. Ele substitui o padrão "Selecionar uma data abaixo".
  • –title: define o título da janela de diálogo do calendário.
  • –day: define o dia que é selecionado quando o calendário abre.
  • –month: define o mês selecionado quando o calendário é aberto.
  • –ano: define o ano que é selecionado quando o calendário é aberto.

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 no exemplo anterior, mas aqui temos a data selecionada armazenada em uma variável. No exemplo anterior, ele foi impresso e esquecido.

 ChosenDate = $ (zenity - calendário - texto "Escolha uma data" --título "How-To Geek Rota" --dia 1 - mês 9 - ano 2019); echo $ ChosenDate 

Agora, o calendário exibe o nosso prompt e o título da nossa janela. A data é definida para a data de início escolhida, em vez da data de hoje.

Também podemos personalizar o formato da string de data retornada quando uma seleção é feita. A opção --date-format deve ser seguida por um especificador de formato. Esta é uma string de tokens que define os dados e formatos que devem ser incluídos na saída. Os tokens são os mesmos usados ​​com a função de linguagem C strftime () e há uma grande variedade deles.

Os tokens que estamos usando são:

  • % R: O nome completo do dia da semana.
  • % d: o dia do mês como um dígito.
  • % m: o mês como um dígito.
  • % y: o ano como dois dígitos (sem século).

 ChosenDate = $ (zenity - calendário - texto "Escolha uma data" --título "How-To Geek Rota" - formato -data = "% 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 em ordem européia: dia, mês, ano.

A janela de diálogo Seleção de arquivo: Escolhendo um arquivo

As janelas de diálogo de seleção de arquivos são bastante complexas. As pessoas podem navegar pelo sistema de arquivos, destacar um arquivo ou arquivos e, em seguida, clicar em "OK" para selecionar esses arquivos ou cancelar a seleção.

zenity fornece toda essa funcionalidade 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:

  • –file-selection: Diz zenity que queremos para usar uma janela de diálogo de seleção de arquivos.
  • –multiple: Permite que alguém selecione mais de um arquivo.
  • –file-filter: Informa à janela de diálogo quais tipos de arquivos exibir.

 zenity - seleção de arquivos --tile "How-To Geek" --multiple --file-filter = '*. mm * .png * .page *. sh * .txt '

A janela de seleção de arquivos é tão funcional quanto qualquer outra janela de seleção de arquivos.

O usuário pode navegar pelo sistema de arquivos e selecionar o arquivo de sua escolha.

Nós navegamos para um novo diretório e selecionamos um arquivo chamado “button_hybrid.png.”

Quando você clica em “OK”, a janela de diálogo de seleção de arquivos é fechada, e o nome do arquivo e caminho são impressos na janela do terminal.

para usar o nome do arquivo em qualquer outro processamento, você pode capturá-lo em uma variável, assim como você fez para a data do calendário.

A Janela de Seleção de Arquivos: Salvando um Arquivo

Se adicionarmos uma opção, podemos vire a janela de diálogo de seleção de arquivos para uma janela de diálogo para salvar arquivos. A opção é --save. Também usaremos a opção --confirm-overwrite. Isso solicita que a pessoa confirme se deseja substituir um arquivo existente.

 Resposta = $ (zenity --file-selection --save --confirm-overwrite); echo $ Response 

A janela de diálogo para salvar arquivos é 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 dentro do 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”, aparece uma janela de diálogo de confirmação pedindo que ele confirme que deseja substituir o arquivo existente. Observe o nome do arquivo aparece na caixa de diálogo de aviso. Esse é o tipo de atenção aos detalhes que dá ao zenity sua aparência profissional.

Se não tivéssemos usado a opção --confirm-overwrite, o arquivo teria sido substituído de forma silenciosa.

O nome do arquivo é armazenado na variável Response, que é impressa na janela do terminal.

Janelas de diálogo de notificação

Com zenity, incluir janelas de diálogo de notificação em seus scripts é fácil. Existem janelas de diálogo de ações 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 --wid 300 --text "Permissão negada. Não é possível gravar no arquivo." 

As novas opções que estamos usando são:

    < li> –error: Diz ao zenity que queremos usar uma janela de diálogo de erro.
  • –width: Define a largura inicial da janela.

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 completa. Clique em OK para continuar." 

A nova opção que estamos usando é --info, que diz ao zenity para criar uma janela de diálogo de informações.

Para criar uma janela de diálogo de perguntas, use o seguinte comando:

 zenity --question - largura 300 --text "Você está feliz em prosseguir? "; echo $? 

A nova opção que estamos usando é --question, que diz ao zenity para criar uma janela de diálogo de perguntas.

O $? é um parâmetro especial. Ele contém o valor de retorno do pipeline de primeiro plano executado mais recentemente. Em termos gerais, esse é o valor do processo fechado mais recente. Um valor zero significa "OK" e um valor de um ou mais significa "Cancelar".

Essa é uma técnica geral que você pode aplicar a qualquer uma das janelas de diálogo do zenity. Ao verificar esse valor no seu script, você pode determinar se os dados retornados de uma janela de diálogo devem ser processados ​​ou ignorados.

Clicamos em "Sim" para que 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 "Low Hard Drive Space" - largura 300 - texto "Pode não haver espaço suficiente no disco rígido para salvar o backup." 

A nova opção que estamos usando é --warning, que diz ao zenity para criar uma janela de diálogo de aviso.

A janela de diálogo de aviso aparece. Não é uma questão, por isso só tem um botão.

Janela de diálogo de progresso

Você pode usar a janela de diálogo de progresso do zenity para exibir um progresso barra que indica quão próximo do seu script está a conclusão.

A barra de progresso é avançada de acordo com os valores que são inseridos a partir do seu script. Para demonstrar o princípio, use o seguinte comando:

 (para i em $ (seq 0 10 100); faça echo $ i; sleep 1; pronto) 

O comando se divide assim:

  • O comando seq percorre uma sequência de 0 a 100, em etapas de 10.
  • Em cada passo, o valor é armazenado na variável i. Isso é impresso na janela do terminal.
  • O comando pausa por um segundo, devido ao comando sleep 1.

Podemos usar isso com a janela de diálogo de progresso do zenity demonstrar a barra de progresso. Observe que estamos direcionando a saída do comando anterior para o zenity:

 (para i em $ (seq 0 10 100); do echo $ i; sleep 1; concluído) | zenity --progress --title "How-To Geek" - fechamento automático 

As novas opções que estamos usando são:

    < li> –progress: Diz ao zenity que queremos usar uma janela de diálogo de progresso.
  • –auto-close: Fecha a caixa de diálogo quando a barra de progresso atinge 100%.

A janela de diálogo de progresso aparece e a barra avança em direção a 100 por cento, pausando por um segundo entre cada etapa.

Podemos usar esse conceito de valores de tubulação em 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.”

! -list () {echo "# Primeiro item de trabalho" echo "25" sleep 1 echo "# Segundo item de trabalho" echo "50" sleep 1 echo "# Terceiro item de trabalho" echo "75" sleep 1 echo "# Último item de trabalho "echo" 100 "sleep 1} lista de trabalho | zenity --progress --title "How-To Geek" --auto-close exit 0 

Aqui está um detalhamento do script:

  • O script define uma função chamada lista de trabalho. É aqui que você coloca seus comandos e instruções para realizar um trabalho real. Substitua cada um dos comandos do sleep 1 pelos seus reais.
  • O zenity aceita as linhas "# ..." e exibe-as dentro da janela de diálogo de progresso. Altere o texto dessas linhas para que elas passem mensagens informativas para o usuário.
  • As linhas de eco que contêm números, como echo "25", também são aceitas pelo zenity e definem o valor da barra de progresso. .
  • A função lista de trabalho é chamada e canalizada para o zenity.

Use este comando para tornar o script executável:

 chmod + x progress.sh 

Use este comando para executar o script:

 ./progresso.sh 

O script é executado e a mensagem de texto é alterada à medida que cada fase do script é executada. A barra de progresso se move em passos em direção a 100 por cento.

Janela de diálogo Escala

A janela de diálogo da 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:

  • –escala: Diz ao zenity que queremos usar uma janela de diálogo de escala.
  • –min-value: define o valor mínimo da escala.
  • –max-value: define o valor máximo da escala. < li> –step: Define a quantidade em que o controle deslizante se move quando as teclas de seta são usadas. Isso não afeta os movimentos do controle deslizante se alguém usar o mouse.
  • –value: Define o valor inicial e a posição do controle deslizante.

Este é o comando que ' re usando:

 Resposta = $ (zenity --scale --title "How-To Geek" --texto "Select magnification." --min-value = 0 --max-value = 30 - passo = 3 - valor 15); $ 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.

Janela de diálogo de entrada

A janela de diálogo de entrada permite que alguém insira texto.

As novas opções que estamos usando são:

  • –entry: Diz ao zenity que queremos usar uma janela de diálogo de entrada.
  • –entry-text: Você pode usar isso se quiser digitar um valor sugerido no campo de entrada de texto. Estamos usando "" para forçar um campo vazio. Isso não é estritamente necessário, mas queríamos documentar a opção.

O comando completo se parece com isto:

 Response = $ (zenity - entry --text "Digite seu termo de pesquisa" --título "Howe-To Geek" --entry-text = ""); echo $ Response 

Uma simples janela de diálogo aparece, contendo um campo de entrada de texto.

Alguém pode digitar e editar text.

Quando ele clica em “OK”, o valor que ele digita é atribuído à variável Response. Usamos echo para imprimir o valor da variável na janela do terminal.

Juntando tudo

Vamos juntar essas técnicas e criar um ambiente funcional roteiro. O script executará uma verificação 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 exame longo ou curto.

Para esse script, usaremos três tipos de janelas de diálogo, duas das quais são novas para nós:

  • primeiro é uma janela de diálogo de lista. Permite que alguém faça uma escolha.
  • A segunda é uma janela de diálogo de progresso que permite ao usuário saber que algo está acontecendo e deve esperar.
  • A terceira é uma janela de informações de texto , que exibe os resultados para o usuário.

Digite este texto em um editor e salve-o como “hardware-info.sh.”

 #! / bin / bash # Exibir listagem de hardware para este computador TempFile = $ (mktemp) ListType = `zenity --width = 400 --height = 275 --list --radiolist \ --title 'Varredura de hardware' \ --text 'Selecione o tipo de varredura:' \ --column 'Selecione' \ --column 'Scan Type' TRUE "Short" FALSE "Long" `if [[$? -eq 1]]; então # eles pressionaram o botão Cancelar ou fecharam a janela de diálogo zenity --error --title = "Verificar Recusado" --width = 200 \ --text = "Verificação de hardware ignorada" exit 1 elif [$ ListType == "Short"]; então # eles selecionaram o botão de opção curto Flag = "- short" else # selecionaram o longo botão de opções Flag = "" fi # procuraram informações de hardware com o valor apropriado em $ Flag hwinfo $ Flag | tee > (zenity - largura = 200 --height = 100 \ --title = "Informações de agrupamento" --progress \ --pulsate --text = "Verificando hardware ..." \ --auto-kill - auto-close) > $ # Exibe as informações de hardware em uma janela de rolagem zenity --width = 800 --height = 600 \ --title "Detalhes do hardware" \ --text-info --filename = "$" exit 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 opção --list para crie uma janela de diálogo zenity chamada de janela de diálogo list. Os caracteres "\" no final das linhas dizem ao script para tratá-los como uma linha longa que está contornada. Este é o processo:

  • Especificamos a largura e a altura da janela.
  • A janela de diálogo da lista é compatível com colunas. A opção --radiolist faz com que a primeira coluna seja uma coluna de botões de opção.
  • Definimos um título e um prompt de texto para a janela.
  • Definimos o título da primeira coluna para ser "Selecionar". O conteúdo desta coluna será os botões de opção.
  • Definimos o título da segunda coluna como "Selecionar" e fornecemos o conteúdo da segunda coluna. Essa coluna contém dois rótulos de texto: "Curto" e "Longo". Os indicadores VERDADEIRO e FALSO indicam que a opção "Curto" é selecionada por padrão quando a janela de diálogo é exibida.
  • Armazenamos o resultado de esta janela de diálogo em uma variável chamada ListType.

 ListType = `zenidade - largura = 400 --height = 275 --list --radiolist \ --title 'Varredura de hardware '\ --text' Selecione o tipo de escaneamento: '\ --column' Selecione '\ --column' Tipo de escaneamento 'TRUE "Curto" FALSE "Long" `

Se o usuário teclar" Cancelar, ”Não precisamos verificar o valor em ListType, podemos simplesmente sair. Se ele pressionar "OK", precisamos descobrir se ele selecionou o botão de opção "Curto" ou "Longo":

  • O parâmetro especial $? equivale a zero se o usuário pressionou “OK”. Igual a um se ele pressionou “Cancelar” ou fechou a janela.
  • Se for igual a um, o script exibe uma janela de diálogo de informações de erro e sai. Se ele pressionar "OK", prosseguiremos para testar o valor na variável ListType.
  • Se a variável ListType mantiver o valor "Short", o script definirá uma variável chamada Flag como "–short. "
  • Se a variável ListType não mantiver o valor" Curto ", ele deve conter o valor" Longo ". O script define uma variável chamada Flag como" ", que é uma string vazia. / li>
  • O script usa a variável Flag na próxima seção.

 se [[$? -eq 1]]; então # eles pressionaram o botão Cancelar ou fecharam a janela de diálogo zenity --error --title = "Verificar Recusado" --width = 200 \ --text = "Verificação de hardware ignorada" exit 1 elif [$ ListType == "Short"]; então # eles selecionaram o botão de opção curto Flag = "- short" else # selecionaram o longo botão de rádio Flag = "" fi 

Agora que o script sabe qual tipo de varredura o usuário deseja, podemos execute a varredura de informações de hardware:

  • O script chama o comando hwinfo e transmite o valor na variável Flag.
  • Se o Flag contiver “–short,” o comando hwinfo executa uma varredura curta. Se o valor de Flag for “”, nada passa para o hwinfo e uma varredura longa e padrão é executada.
  • O script canaliza a saída do hwinfo para o tee. tee envia a saída para zenity e o TempFile.
  • O script cria uma janela de diálogo da barra de progresso. Ele define a largura e a altura da janela de diálogo e os textos de título e prompt.
  • O script não pode saber com antecedência quantas informações o comando hwinfo produzirá, por isso não pode definir a barra de progresso para avançar corretamente para 100 por cento. A opção --pulso 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.
  • A opção --auto-kill encerra o script se alguém clicar em “Cancelar”.
  • A opção --auto-close faz com que a caixa de diálogo de progresso seja fechada automaticamente quando o processo de monitoramento estiver concluído.

 # pesquisa informações de hardware com o valor apropriado em $ Flag hwinfo $ Flag | tee > (zenity - largura = 200 --height = 100 \ --title = "Informações de agrupamento" --progress \ --pulsate --text = "Verificando hardware ..." \ --auto-kill - auto-close) > $ 

Quando a verificação do hwinfo é concluída, o script chama zenity para criar uma janela de diálogo de informações de texto com a opção --text-info. A janela de diálogo de informações de texto exibe o conteúdo do arquivo TempFile:

  • O script define a largura e a altura da janela de diálogo e o texto do título.
  • opção é usada para ler o conteúdo do arquivo mantido na variável TempFIle.

 # Exibe as informações de hardware em uma janela de rolagem zenity --width = 800 --height = 600 \ "title" Detalhes do hardware "\ --text-info --filename =" $ "

Quando o usuário fecha a janela de diálogo de informações de texto, o script é encerrado.

[ PRE] exit 0

Vamos acionar e dar uma olhada.

 ./ hardware-info.sh 

A caixa de listagem é exibida. A opção “Short” é selecionada por padrão.

Vamos selecionar “Long” e depois clicar em “OK”.

A janela de progresso aparece com um indicador deslizante. Ele permanece na tela até que a verificação de hardware seja concluída.

Quando a verificação de hardware estiver concluída, a janela de diálogo de informações de texto aparece com detalhes da verificação.

Clique em “OK”.

Mesmo um jóquei de 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 .

 

Via: How to Geek

Veja Também:

Nenhum comentário