Как мне создать фальшивую панель процессов?

Я хочу, чтобы терминал отображал какую-то панель процессов в зависимости от времени, например, 1% каждые 60 секунд.

3 ответа

Решение

Создать индикатор прогресса в подходах bash списков, чтобы получить индикатор выполнения, поэтому я сконцентрируюсь на том, как подделать часть здесь. Я буду использовать 2 секунды вместо ваших 60 здесь только для тестирования, отрегулируйте sleep ценность для ваших точных потребностей.

С помощью dialog, whiptail или же zenity (GUI),

for i in {1..100}; do sleep 2; echo $i; done | dialog --gauge 'Running...' 6 60 0

это for петли петли 1 над числами от одного до ста echo с ними каждый 2 секунд, выход затем передается по dialog, который показывает число как прогресс на индикаторе выполнения. Этот подход работает для whiptail а также zenity --progress (GUI), а также. dialog вывод выглядит так с цветной прогресс-бар с использованием 'curses' в текстовом режиме:

С помощью pv

for i in {1..100}; do sleep 2; echo; done | pv -pWs100 >/dev/null

Этот цикл очень похож, просто он печатает только новую строку (=1 байт данных) каждый 2 секунды, pv Затем говорят ожидать точно 100 байты данных и показывают p Рогресс-бар. В окне терминала шириной 80 символов вывод выглядит так:

[===============>                                                          ] 22%

Построение собственного индикатора прогресса

С помощью простого цикла вы также можете создать свой собственный индикатор выполнения. Вот несколько примеров, которые просто печатают 100 # в одну строку, один раз в 2 секунды:

# number signs only
$ for i in {1..100}; do sleep 2; echo -n \#; done; echo
####################################################################################################

# with progress in % on the right
$ for i in {1..100}; do sleep 2; printf "%0.s#" $(seq 1 $i); printf "%0.s " $(seq $i 100); printf "%3d%%\r" "$i"; done; echo
######################################################                                                54%

# with progress in % on the left
$ for i in {1..100}; do sleep 2; printf "%3d%% " "$i"; printf "%0.s#" $(seq 1 $i); printf "%0.s " $(seq $i 100); printf "\r"; done; echo
 39% ####################################### 

1 Смотри, Полиптотон!

Fake Progress Bar

Вот мой фальшивый индикатор выполнения:

Оно использует yad которая является суперзаряженной версией zenity графический интерфейс по умолчанию, используемый в терминале. Установить yad использовать:

sudo apt install yad

Вот код, который вы можете скопировать и вставить, потому что у всех есть /usr/bin каталог:

#!/bin/bash

# NAME: yad-progress-bar
# PATH: $HOME/bin
# DESC: Display yad progress bar % with names.
# DATE: Apr 23, 2018.

title="AU question: https://Ask-ubuntu.ru/q/1027543/307523"
Percent=0  

for f in /usr/bin/* ; do    # 1000+ files so this is fake loop
    echo "#$f"              # Display file name in progress bar.
    echo $Percent           # Percent complete
    Percent=$(( $Percent + 1 ))
    [[ $Percent -gt 100 ]] && break
    sleep .05               # Change to 2 seconds for OP's fake.

done | yad --progress     --auto-close \
    --width=500             --height=300 \
    --title="$title"        --enable-log "Current filename" \
    --log-expanded          --log-height=250 \
    --log-on-top            --percentage=0 \
    --no-cancel             --center

exit 0

Процент увеличивается на 1 в каждой итерации for петля. Он должен рассчитывать проценты для 1000+ файлов, но останавливается после 100 файлов.

Взяв комментарий от @wjandream и просто используя for i в {1..100}, третий вариант сводится к:

для ((я=0; я<=100; я++)); { эхо "$i"; echo "# Загрузка $i%";sleep 0.2; } | yad --progress --title="Загрузка..." --height=90 --width=400 --center --text="Подождите..." --auto-close --no-buttons -- нет выхода

Другие вопросы по тегам