Как повторить команду, если в файле есть определенная строка?

Как повторить команду, если в файле есть определенная строка?

Я хочу повторить команду, пока в ее выводе есть определенная строка, которая указывает на то, что произошла ошибка. Команда — gksu ./installer.run > ./inst.log 2>&1 Что я хочу сделать, так это повторить ее, пока в 'string'. ./inst.logКак это сделать из командной строки bash?

решение1

Найти строку в файле:

grep -q string file

Выходное значение сообщает, нашел ли grep что-либо.

Затем вы можете выполнять цикл до тех пор, пока команда не вернет истинное значение выхода:

while command ; do
    repeat this
done

Хотя вы хотите выполнить команду хотя бы один раз, так что, возможно,

while true ; do
    some command
    if ! grep -q string file ; then
        break         # jump out of the loop if it's _not_ there
    fi
done

В противном случае вам придется повторить команду перед циклом и внутри него.

решение2

Обратите внимание, что в while while-cmd-list; do do-cmd-list; done, while-cmd-listестьтакжесписок команд. Это не обязательно должна быть одна команда.

Итак, вы можете сделать:

while
  gksu ./installer.run > ./inst.log 2>&1
  grep -q string inst.log
do
  echo >&2 "Trying again, output contained string"
done

Хотя здесь вы также можете сделать:

while
  gksu ./installer.run 2>&1 |
    tee ./inst.log |
    grep string > /dev/null
do
  echo >&2 "Trying again, output contained string"
done

(обратите внимание, что мы не используем -q, так как это может привести к grepпреждевременному завершению работы, из-за чего установщик получит сигнал SIGPIPE).

Связанный контент