2

Следующий скрипт bash является примером использования команды диалога. Этот скрипт запускает индикатор выполнения (и отображает процесс обновления). В этом диалоговом окне отсутствуют часы времени, которые показывают, сколько времени выполнялась индикатор выполнения, каждую секунду, до конца.

Я не уверен, что это позволяет диалог, поэтому я спрашиваю, можно ли напечатать часы внутри диалогового окна?

Если нет, каковы другие альтернативы? (например, часы, которые работают за пределами диалогового окна)

  #!/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

ОБНОВЛЕНИЕ: Я также нашел некоторый код таймера, и я хочу объединить этот код в диалоговой строке - как мне это сделать?

Скрипт таймера (код):

 date1=`  date   +%s`; 
   while true; do 
   echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
   done

1 ответ1

1

В самом деле, было бы неплохо, если бы в диалоге была опция --show-elapsed или что-то еще, сделать это сейчас непросто.

Часть отображения не слишком сложна: вы можете (ab) использовать опцию --title для отображения истекшего времени. Вы даже можете сделать так, чтобы он отображался под датчиком, добавив еще \n (и изменив размер поля).

Еще сложнее, чтобы он отображался каждую секунду, даже если между обновлениями состояния есть 50 секунд. Вот решение, использующее опцию read -t timeout:

#!/bin/bash

show_dialog()
{
    p=0             # percentage
    date1=`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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .