Zu meinen Aufgaben gehört auch die Datenverarbeitung. Eine der Aufgaben besteht darin, eine Reihe von Verzeichnissen (die wirDirfür jetzt) und kopieren Sie sie an einen neuen Speicherort mit dem Namen DirFlat.
Dies kann lange dauern (30 Minuten -> 2-3 Stunden)! Ich möchte den Fortschritt verfolgen können, also verwende ich find Dir -type f|wc -l
die Anzahl der Dateien (nennen wir dies ) $Filenum
, und führe dann einen sehr kurzen Befehl aus, den ich geschrieben habe (ich habe ihn von meinem Notizbuch abgetippt, habe ihn vielleicht falsch kopiert, ich hoffe, Sie verstehen das Wesentliche):
echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)
Wenn ich es jedoch ausführe, watch -n 100 "!!"
übernimmt es die Ausgabe des Echos und druckt diese weiter (auch das Datum ändert sich nicht).
Kann ich damit die Variable aktualisieren/die Zuweisung der internen Variablen in BASH erneut ausführen? Hoffentlich hilft mir das bei der Automatisierung einiger meiner Aufgaben.
Antwort1
Kontrast:
$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013
$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)
echo "($ls DirFlat |wc -l)*100/$FileNum"|bc
Sie haben und ausgeführt date
, die Ausgabe jedes Befehls in den Shell-Befehl eingesetzt watch -n 100 "echo $(…) % $(…)"
und diesen ausgeführt. Sie müssen die Erweiterung des Befehls in der übergeordneten Shell verhindern und ihn stattdessen als Zeichenfolge an übergeben, damit watch
er ausgeführt wird. Dies ist ganz einfach, indem Sie den Befehl in einfache Anführungszeichen statt in doppelte Anführungszeichen setzen.
Antwort2
Alternativ können Sie es in eine Shell-Schleife einbinden:
while sleep 100; do
(... your stuff ...)
if [ (... process has finished ...) ]; then
(... beep or get operator's attention otherwise ...)
break
fi
done
Antwort3
Dies musst du in ein Shell-Skript einfügen und watch dieses Skript dann aufrufen lassen.
Antwort4
Eine while-Schleife mit dem Befehl, den Sie ausführen möchten, und dem sleep-Befehl ermöglicht es Ihnen auch, den Linux-Befehl wiederholt auszuführen, wie den watch-Befehl. In diesem speziellen Fall ist die Antwort von @peterph jedoch besser, da sie eine Beendigungsbedingung hat. Diese kürzere Antwort beantwortet nur die Frage, wie beim erneuten Ausführen desselben Prozesses aktualisiert wird.
while true; do echo $(date +"%T"); sleep 1; done
Die Zahl nach dem Ruhezustand wird in Sekunden angegeben.