Timer em execução sob o script bash na janela de diálogo

2

O seguinte script bash é um exemplo de como usar o comando de diálogo. Este script executa uma barra de progresso (e exibe a atualização do processo). O que está faltando na caixa de diálogo é um cronômetro - que exibe quanto tempo a barra de progresso está sendo executada, a cada segundo, até o final.

Não tenho certeza se o diálogo permite isso, por isso pergunto se é possível imprimir o relógio dentro da janela de diálogo?

Se não, quais são outras alternativas? (por exemplo, um relógio que é executado fora da janela de diálogo)

  #!/bin/bash
  declare PACKAGES=("/etc/crontab"  "/etc/dmtab"  "/etc/fstab"  "/etc/inittab"  "/etc/mtab")
     NUM_PACKAGES=${#PACKAGES[*]} # no. of packages to update (#packages in the array $PACKAGES)
  step=$((100/$NUM_PACKAGES))  # progress bar step
   cur_file_idx=0
   counter=0
 DEST=${HOME}
    (
    # infinite while loop
    while :
  do
  cat <<EOF
  XXX
 $counter
   $counter% upgraded

   $COMMAND
   XXX
   EOF
       COMMAND="cp ${PACKAGES[$cur_file_idx]} $DEST &>/dev/null" # sets/updates command to exec.
      [[ $NUM_PACKAGES -lt $cur_file_idx ]] && $COMMAND # executes command

   (( cur_file_idx+=1 )) # increase counter
     (( counter+=step ))
   [ $counter -gt 100 ] && break  # break when reach the 100% (or greater
                               # since Bash only does integer arithmetic)
   sleep 10 # delay it a specified amount of time i.e. 1 sec
 done
     ) |
      dialog --title "File upgrade" --gauge "Please wait..." 10 70 0

UPDATE: Eu também encontrei um código temporizador e quero combinar este código na linha de diálogo - como faço isso?

O script do temporizador (código):

 date1='  date   +%s'; 
   while true; do 
   echo -ne "$(date -u --date @$(('date +%s' - $date1)) +%H:%M:%S)\r"; 
   done
    
por maihabunash 18.09.2014 / 11:04

1 resposta

1

Na verdade, seria bom se a caixa de diálogo tivesse uma opção --show-elapsed ou algo assim, não é fácil fazer isso atualmente.

A parte de exibição não é muito difícil: você pode (ab) usar a opção --title para exibir o tempo decorrido. Você pode até fazer com que ele seja exibido abaixo do medidor adicionando mais \n (e alterando o tamanho da caixa).

Maiscomplicadoéfazercomqueeleapareçaacadasegundo,mesmosehouver50sentreasatualizaçõesdestatus.Aquiestáumasoluçãousandoaopçãoread-ttimeout:

#!/bin/bashshow_dialog(){p=0#percentagedate1='date+%s'while["$p" != 100 ]; do
        read -t 1 tmp && p=$tmp
        elapsed="$(date -u --date @$(('date +%s' - $date1)) +%H:%M:%S)"
        echo $p | dialog --title "File upgrade" --gauge "Please wait...\n\n\n\n$elapsed" 10 70 0
    done
}

task()              # fake task
{ for p in 'seq 1 100'; do echo $p; sleep 2; done; }

task | show_dialog
    
por 15.10.2014 / 23:14