Ich schaue mir diese Antwort anHierund ich möchte den Fortschrittsbalken implementieren, während ich auf die Ausführung eines Prozesses warte – oder in meinem Fall – mehrerer.
Ich führe mehrere Kopien großer Dateisysteme parallel aus und verwende dazu den folgenden Codeausschnitt
for svol in "${svols[@]}";
do
syslog_info "copying $svol"
${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
wait
und ich möchte den Fortschrittsbalken hinzufügen, der angezeigt wird, während ich darauf warte, dass die Prozesse im Hintergrund wieder aufgenommen werden.
Dies ist mein Versuch. Kann mir jemand sagen, was ich falsch mache, oder mir helfen, es zum Laufen zu bringen?
for svol in "${svols[@]}";
do
syslog_info "copying $svol"
${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
i=1
sp="/-\|"
echo -n ' '
until wait;
do
printf "\b${sp:i++%${#sp}:1}"
sleep 0.1
done
EDIT: Ich habe den ursprünglichen Code in dieser Frage zu einer getesteten funktionierenden Lösung aktualisiert - versuche immer noch, ihn zum Laufen zu bringen, bis die Wartezeit wiederkehrt
Nebenbei bemerkt - der Originalcode oben funktioniert so wie er ist einwandfrei und der folgende Codeausschnitt funktioniert auch als eigenständiger Code
i=1
sp="/-\|"
echo -n ' '
for i in {1..100};
do
printf "\b${sp:i++%${#sp}:1}"
sleep 0.1
done
Antwort1
wait
blockiert, bis alle Hintergrundjobs zurückgegeben wurden. Sie können es daher nicht als until
Bedingung verwenden, da es nur einmal ausgeführt wird.
Sie können stattdessen Folgendes verwenden, [ -n "$(jobs)" ]
um zu prüfen, ob bei Ihnen Jobs ausgeführt werden:
while [ -n "$(jobs)" ]; do
printf "\b${sp:i++%${#sp}:1}"
sleep 0.1
done
Antwort2
Unter GNU/Linux können SieDieCoreutils-Fortschrittsanzeige( progress
, früher bekannt als cv
):
"${CP}" -p -- "$svol" "$somedir" & progress -mp "$!"