Bash: Progressbar oder Spinner

0

Bei interaktiven Scripten sollten die Scripte dem Anwender immer eine Rückmeldung geben, ob sie gerade noch arbeiten.

Auf die Schnelle programmierte Schleifen neigen jedoch dazu ggf. lange zu laufen und dem Anwender keine Rückmeldung zu geben. Aus diesem Grund möchte ich nachfolgend zwei Möglichkeiten vorstellen, wie in Schleifen eine Rückmeldung erfolgen kann.

Progressbar

Progress : [#---------------------------------------] 3% (1406/45045)

Die Progressbar besteht aus einer Funktion, die den Fortschritt ausgibt.

function progressbar {
  #######################################
  # Display a progress bar
  # Arguments:
  #   $1 Current loop number
  #   $2 max. no of loops (1005)
  # Returns:
  #   None
  #######################################

  # Process data
  let _progress=(${1}*100/${2}*100)/100
  let _done=(${_progress}*4)/10
  let _left=40-$_done

  # Build progressbar string lengths
  _fill=$(printf "%${_done}s")
  _empty=$(printf "%${_left}s")

  # 1.2 Build progressbar strings and print the progressbar line
  # 1.2.1 Output example:
  # 1.2.1.1 Progress : [########################################] 100%
  printf "\rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%% ($1/$2)"
}

Um die Progressbar darzustellen, muss ein Zähler (_start) und der Maximalwert (_end) definiert werden.

      _start=0
      _end=$(wc -l $1)

Anschließend kann pro Schleifendurchlauf der Fortschitt dargestellt werden.

        let _start=_start+1
        progressbar ${_start} ${_end}

Quelle: http://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script

Spinning Wheel

Das Spinning Wheel kann verwendet werden, anzuzeigen, dass ein Prozess in einer Subshell läuft.

Restarting DNS Service [\]

Dazu gibt es zwei Funktionen:

– spinner() gibt den Spinner aus, solange der angegebene Prozess existiert.

spinner() {
        local pid=$1
        local delay=0.50
        local spinstr='/-\|'
        while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do
                local temp=${spinstr#?}
                printf " [%c]  " "${spinstr}"
                local spinstr=${temp}${spinstr%"$temp"}
                sleep ${delay}
                printf "\b\b\b\b\b\b"
        done
        printf "    \b\b\b\b"
}

– call_spinner() gibt eine Meldung und initiiert den spinner.

function call_spinner() {
  echo -n "${2}"
  spinner $!
}


Der Aufruf des Spinners selber erfolgt über die Funktion call_spinner() mit der ID des zu überwachenden Prozesses und der anzuzeigenden Meldung.

tar cfv.... &
call_spinner "${!}""Restarting DNS Service"

Quelle: http://fitnr.com/showing-a-bash-spinner.html

Spinner mit Start- und Stop-Funktion: https://github.com/tlatsas/bash-spinner/blob/master/spinner.sh

Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

Antworten