
Ich möchte einen Befehl wiederholen, während in seiner Ausgabe eine bestimmte Zeichenfolge vorhanden ist, die anzeigt, dass ein Fehler aufgetreten ist. Der Befehl lautet: gksu ./installer.run > ./inst.log 2>&1
Ich möchte ihn wiederholen, während 'string'
in enthalten ist ./inst.log
. Wie kann ich dies von einer Bash-Befehlszeile aus tun?
Antwort1
Zeichenfolge in einer Datei suchen:
grep -q string file
Der Exit-Wert gibt an, ob grep etwas gefunden hat.
Anschließend können Sie eine Schleife ausführen, bis ein Befehl einen wahren Exit-Wert zurückgibt:
while command ; do
repeat this
done
Allerdings möchten Sie den Befehl mindestens einmal ausführen, also vielleicht
while true ; do
some command
if ! grep -q string file ; then
break # jump out of the loop if it's _not_ there
fi
done
Andernfalls müssten Sie den Befehl vor und innerhalb der Schleife wiederholen.
Antwort2
while while-cmd-list; do do-cmd-list; done
Beachten Sie , dass in while-cmd-list
istAucheine Liste von Befehlen. Es muss nicht unbedingt ein einzelner Befehl sein.
Sie können also Folgendes tun:
while
gksu ./installer.run > ./inst.log 2>&1
grep -q string inst.log
do
echo >&2 "Trying again, output contained string"
done
Sie können hier jedoch auch Folgendes tun:
while
gksu ./installer.run 2>&1 |
tee ./inst.log |
grep string > /dev/null
do
echo >&2 "Trying again, output contained string"
done
(Beachten Sie, dass wir nicht verwenden -q
, da dies bedeuten würde, grep
dass es vorzeitig beendet werden könnte, wodurch das Installationsprogramm ein SIGPIPE erhalten würde).