Wie wiederholt man einen Befehl, wenn eine Datei eine bestimmte Zeichenfolge enthält?

Wie wiederholt man einen Befehl, wenn eine Datei eine bestimmte Zeichenfolge enthält?

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; doneBeachten Sie , dass in while-cmd-lististAucheine 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, grepdass es vorzeitig beendet werden könnte, wodurch das Installationsprogramm ein SIGPIPE erhalten würde).

verwandte Informationen