
Я хочу повторить команду, пока в ее выводе есть определенная строка, которая указывает на то, что произошла ошибка. Команда — 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).