@sequelone

Есть ли заготовка bash скрипта с прогресс баром?

Всем привет. Начинаю изучать Bash. Уже написал пару функций для настройки и установки пакетов. Хотелось бы процесс установки визуализировать, нашёл в интернете много примеров прогресс баров, к примеру вот такой https://github.com/edouard-lopez/progress-bar.sh , но не понимаю как его привязать к такой функции:

#!/bin/bash
set -e

CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
source ${CURRENT_DIR}/common/common.sh
source ${CURRENT_DIR}/common/progress-bar.sh

[ $(id -u) != "0" ] && { ansi -n --bold --bg-red "Выполните этот скрипт с учетной записью root"; exit 1; }

MYSQL_ROOT_PASSWORD=`random_string`

progress-bar() {
  local duration=${1}
    already_done() { for ((done=0; done<$elapsed; done++)); do printf "▇"; done }
    remaining() { for ((remain=$elapsed; remain<$duration; remain++)); do printf " "; done }
    percentage() { printf "| %s%%" $(( (($elapsed)*100)/($duration)*100/100 )); }
    clean_line() { printf "\r"; }

  for (( elapsed=1; elapsed<=$duration; elapsed++ )); do
      already_done; remaining; percentage
      sleep 1
      clean_line
  done
  clean_line
}

function init_system {
    export LC_ALL="en_US.UTF-8"
    echo "LC_ALL=en_US.UTF-8" >> /etc/default/locale
    locale-gen en_US.UTF-8
	locale-gen de_DE.UTF-8
    locale-gen ru_RU.UTF-8

    ln -sf /usr/share/zoneinfo/Europa/Berlin /etc/localtime
	
	mkdir -p /opt/source/php
	mkdir -p /opt/php/

    apt upgrade && apt update
    apt install -y software-properties-common

    init_alias
}

function init_alias {
    alias sudowww > /dev/null 2>&1 || {
        echo "alias sudowww='sudo -H -u ${WWW_USER} sh -c'" >> ~/.bash_aliases
    }
}

call_function init_system "Инициализация системы." ${LOG_PATH}


Нужно чтобы выводило значение "Инициализация системы." и рядом был прогресс бар. Должно выглядеть как-нибудь так:

===> "Инициализация системы." [====____] 50%

А после завершения функции выводило ===> "Инициализация системы." [Завершено]
  • Вопрос задан
  • 597 просмотров
Пригласить эксперта
Ответы на вопрос 2
gedev
@gedev
сисадмин-энтузиаст
Собственно, а чем не устраивает вывод пакетного менеджера? Он довольно подробно пишет ход установки пакетов. Лог будет ползать и показывать что что-то шевелится =). А ваша настройка конфигов вряд ли занимает дольше секунды суммарно (это если учесть, что там будет много регулярок, которые долго выполнятся).

Сам писал такие скрипты, красиво прогресс бар не прикрутите — много разнородных процессов, нет чего-то одного, по чему можно было бы отслеживать прогресс.

Просто выделите свои строки цветом, чтобы их было заметно в потоке лога. Например, так:

G="\e[32m" # green
N="\e[0m"  # no color
echo -e "${G}Инициализация системы   ...   [OK]${N}"

Я также пытался прикручивать спиннеры (просто крутится и показывает, что "оно живое"):

show_spinner() {
    chars="/-\|*"
    while pgrep "$1" > /dev/null; do
        for (( i=0; i<${#chars}; i++ )); do
            sleep 0.2
            echo -en "${chars:$i:1} ${G}Обработка...${N}" "\r"
        done
    done
}

# show_spinner <тут имя процесса, за которым надо следить>
# Например, за find:
show_spinner find
Ответ написан
Комментировать
Все зависит от того для чего ты используешь прогресс бар
к примеру ты собираешься повесить его на архивирование
то тут будет пролома в том а что собственно в нем считать, время ты сам понимаешь рассчитать можно только примерно, притом сильно примерно, а если точно то по фату за это время ты можешь успеть архивнуть весь файл.
Так что тут тебе придётся в лучшем случае считать прогресс в файлах попавших в архив и на основана этого уже строить прогресс.
Правда для этого тебе прийдется посчитать количество файлов к каталоге, при этом исключить те каталоги которые ты исключил при архивирование.
и строить прогресс архивирования уже по количеству файлов попавших в архив.
Это можно сделать через pv
У некоторых утилит есть свой прогресс бар.
В общем проблема в том что собственно считать. в прогрессе. и что взять за единицу.
Если же тебе нужне прогрес в том формате что идет движуха смотри я думаю
То тут можно проще сделать проверять процесс на завершение раз в секунду и ставить к примеру .......
В общем пиши что собираешся конкретно прогрессбарить ;)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы