Usando o Zenity para manter o arquivo de configuração

4

Eu preciso configurar um arquivo de configuração no Bash e acredito que o Zenity é o melhor método, mas estou tendo problemas para encontrar um link usando o google com um exemplo adequado.

Até agora, meu código é assim:

#!/bin/bash

zenity --forms --title="Laptop Adaptive Brightness" --text="Set Configuration" \
   --add-entry="/sys/class/backlight/??????/brightness" \
   --add-entry="Night time (min) value" \
   --add-entry="Day time (max) value" \
   --add-entry="Minutes after sunrise to max" \
   --add-entry="Minutes before sunset to min"

exit

e a tela resultante é assim:

Se os valores não puderem ser atribuídos às variáveis do Zenity, eu poderia colocar o valor atual no rótulo do campo, por exemplo:

   --add-entry="Night time (min) value (Current: $min)", \

E o usuário pode deixar o campo em branco para permanecer o mesmo ou inserir um novo valor.

Ainda sinto falta da melhor maneira de extrair campos do Zenity para bash variáveis e gravá-las no arquivo de configuração. Também estou perdendo o código para ler do arquivo de configuração para bash as variáveis.

Eu apreciaria um link para um exemplo do Zenity ou uma resposta completa seria ainda melhor. Obrigado.

PS Quando eu executo o script acima, um erro é relatado quando ele é concluído:

$ adaptive-brightness-configGtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
||||

Estou um pouco confuso com isso e se você puder apontar o que estou fazendo de errado, também seria apreciado.

    
por WinEunuuchs2Unix 27.02.2017 / 01:17

1 resposta

3

O Zenity só pode exibir o valor anterior quando há apenas um campo de entrada. Assim, o código abaixo coloca os valores anteriores nos campos de rótulo e instrui o usuário a digitar o novo valor em campos de entrada ou deixar em branco para manter o valor existente.

O Código Bash

#!/bin/bash

# Read configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < ~/bin/adaptive-brightness-configuration-file

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Laptop Adaptive Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > ~/bin/adaptive-brightness-configuration-file

Fiquei surpreso depois de horas pesquisando, exemplos desse código não puderam ser encontrados. Espero que outros pesquisando o mesmo problema possam encontrar este código.

A tela

Nesta resposta, o formulário zenity tem um pedido diferente e os rótulos expandidos para os campos. Embora 4882 seja o máximo para esse driver intel_backlight , é como olhar para o sol e 1000 é o máximo prático para ambientes fechados.

Muito obrigado ao muru por orientar a conversão de código original do formato COBOL de estilo antigo usando nomes de campo, para o formato moderno de Bash utilizando matrizes.

    
por WinEunuuchs2Unix 27.02.2017 / 06:05