Мне нужно автоматически перезапустить команду, если предыдущий вывод содержит определенную строку

Предполагая, что значения находятся внутри файла, с pcre grep:

 $ grep -P '(([0-9a-f]+)\.)(?1)+(?2)' file
 9.0.8.2c
 8.1.3.9b

Или с перлом:

 perl -lne '/((([\da-f]+)\.)(?2)+(?3))/;print $1' file
1
08.02.2020, 23:22
1 ответ

ОП также хочет видеть вывод, поэтому нам нужен небольшой скрипт

#!/bin/bash
exec 3>&1   # Make a copy of the stdout fd on fd 3
while "/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON |
     tee /dev/fd/3 | 
     grep 'WARNING:After Effects warning' >/dev/null
do
    echo "Repeating the command"
done

Здесь происходит несколько вещей, и я делаю предположение о том, что поддерживается на macos. execделает fd 3 таким же, как стандартный вывод скрипта. Я надеюсь, что macos сделает это доступным как /dev/fd/3. teeиспользуется для отправки копии вывода aerender на this, поэтому скрипт выводит то же самое, что и исходный код.

Затем выходные данные tee передаются в grep. Я намеренно не использую grep -q, так как это может остановить обработку, как только он увидит первый соответствующий шаблон, что может привести к тому, что teeполучит SIGPIPE, что может привести к тому, что aerender получит SIGPIPE. Если aerender не создает много вывода и выводит сообщение только один раз, это делает его слишком осторожным, но это не повредит.

Если macos не поддерживает /dev/fd/3, можно попробовать

#!/bin/bash
while O="$("/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON)"
    echo "$O"
    echo "$O" | grep 'WARNING:After Effects warning' >/dev/null
do
    echo "Repeating the command"
done

Недостаток этого заключается в том, что будут выводиться все stderr aerender, а затем будут выводиться все stdout, а не в ожидаемом чередующемся режиме.

Все это не проверено, так как у меня нет подходящей системы, чтобы попробовать.

1
28.04.2021, 23:24

Теги

Похожие вопросы