Antworten:
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.
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'
Der Befehl pv
bietet 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
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 ''
Es gibt einen Befehl namens, dialog
der 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 dialog
Dokumentation auf der Website des Projekts sehen .
Bildschirmfoto
Die Implementierung scheint trivial zu sein. Die unten stehende Bash-Funktion (Balken) verhält sich wie Ihr bar
Skript (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
}
. bar.sh #Assuming it's saved in bar.sh
bar $percentage
for i in {1..10}; do bar $((i*10)); sleep 0.1; done;
for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;