Verwenden Sie die Befehlsleiste in Bash ohne E / A?

7

Ich mag das Aussehen der Ausgabe von bar

Dieses Skript wird jedoch nur für Eingabe- / Ausgabevorgänge verwendet.

Wie kann ich es als Ersatz für den Schlaf verwenden, aber mit visuellem Feedback?

sleep 10
rubo77
quelle

Antworten:

9

Ich konnte keinen Weg finden, dies mit zu tun bar. Möglicherweise interessieren Sie sich jedoch für diese anderen Befehle, die dasselbe tun und Ihren Anforderungen besser entsprechen.

Methode 1 - Fake it

Diese Methode überschreibt einfach das, was zuvor auf dem Bildschirm angezeigt wurde, mit einem größeren Fortschrittsbalken. Einfach aber effektiv.

Beispiel ex.bash:

#!/bin/bash

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

Methode 2 - Pipeview

Der Befehl pvbietet Fortschrittsbalkenfunktionen. In diesem Artikel mit dem Titel: Ein Unix-Dienstprogramm, das Sie kennen sollten: Pipe Viewer finden Sie ausführlichere Beispiele .

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Methode 3 - Spinner

Mit dem folgenden Beispielcode können Sie mithilfe einer einfachen Schleife Ihren eigenen "Spinner" erstellen. Innerhalb der Schleife können Sie beliebige Befehle einbetten. Dieser Code stammt aus diesem Artikel mit dem Titel: Kann ich in Bash einen Spinner machen? .

#!/bin/bash

sp='/-\|'
printf ' '
for i in $(seq 3); do
  printf '\b%.1s' "$sp"
  sp=${sp#?}${sp%???}
  sleep 1
done
echo ''

Methode 4 - Dialog

Es gibt einen Befehl namens, dialogder so ziemlich das macht, was Sie wollen. Es werden grafische Dialoge verwendet, die jedoch auf Ncurses basieren, sodass sie in fast jedem Terminal und / oder Skript funktionieren, sofern Ncurses unterstützt werden. Sie können die gesamte dialogDokumentation auf der Website des Projekts sehen .

Bildschirmfoto

ss of guage

Verweise

slm
quelle
Über slm ist die Methode # 1, ein vollständigeres Beispiel: progressbar.sh .
Alexandre
0

Die Implementierung scheint trivial zu sein. Die unten stehende Bash-Funktion (Balken) verhält sich wie Ihr barSkript (basierend auf dem kurzen Screencast). Die Größe wird auch dynamisch mit der Terminalbreite geändert (beim nächsten Aufruf von bar).

#!/bin/bash

#Helper functions
terminal_width(){
  local width_height=`stty size`
  echo ${width_height/* /}
}
string_times_n(){
  local s=$1
  local n=$2
  for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
  local percentage=$1
  local padding=10
  local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
  local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
  local dots_n=$((width - equals_n))

  #ANSI escape sequence magic
  local Esc="\033["
  local up="$Esc""K""$Esc""1A""$Esc""K"

  #Clear the line
  string_times_n ' ' "$width"
  echo -ne "\r"

  #Print the current screen
  printf  "%3s%% [" "$percentage"
    string_times_n '=' "$equals_n"
    string_times_n '.' "$dots_n"
  echo -n "]"

  #Go up unless finished
  if [[ "$percentage" == 100 ]] 
  then
    echo
  else
    echo -e "$up"
  fi
}

Verwendungszweck

. bar.sh #Assuming it's saved in bar.sh
bar $percentage

Beispiel für regelmäßigen Fortschritt:

for i in {1..10}; do bar $((i*10)); sleep 0.1; done;

Beispiel für zufälligen Fortschritt:

for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;
PSkocik
quelle