скрипт bash, управление процессами с помощью stdin/stdout

Пожалуйста, помогите посоветовать, как использовать bash для перехвата stdout подпроцесса и отправки символа в stdin подпроцесса.

Например, используйте bash для управления преобразованием 10 видео с помощью процесса ffmpeg, код bash должен просматривать стандартный вывод каждого процесса ffmpeg, а затем решает, следует ли отправить команду stdin [+]/[-]/[c]/[q] или другую команду для управления ffmpeg.

тайная работа была бы чем-то вроде

ffmpeg -i INPUT_n -c copy -f flv out_n.flv 2>&1 | grep "[MY_PATTERN]"

только когда происходит [MY_PATTERN], это задание показывает слово на своем стандартном выводе. Я хотел бы использовать код bash, чтобы поймать стандартный вывод задания, принять какое-то решение в соответствии со строкой, включенной MY_PATTERN, а затем передать команду в стандартный ввод задания. Думаю, мне нужно активировать новую оболочку с помощью bash, чтобы выполнить задание и взаимодействовать с его стандартным вводом/выводом. Но как?


person Yehudi    schedule 03.10.2013    source источник
comment
пример теперь выражает не только действие выхода, но и другие действия, которые зависят от MY_PATTERN   -  person Yehudi    schedule 04.10.2013


Ответы (1)


Если я правильно понял вопрос, вам нужно использовать grep -q "MY_PATTERN". Это отправит SIGPIPE процессу ffmpeg, как только шаблон будет сопоставлен.

Следующее должно работать для вас:

ffmpeg -i INPUT_n -c copy -f flv out_n.flv 2>&1 | grep -q "[MY_PATTERN]" && some_command

some_command будет выполнено, как только шаблон будет сопоставлен.

person devnull    schedule 03.10.2013
comment
Спасибо за ответ, для меня это решение имеет 2 проблемы. Во-первых, MY_PATTERN может быть регулярным выражением, которое требует последующего обнаружения и выбора регистра в bash. Во-вторых, нужно остановить ffmpeg, введя [q] в стандартный ввод. - person Yehudi; 03.10.2013
comment
это решение, some_command будет выполнено, когда ffmpeg завершится, но я пытаюсь добиться остановки ffmpeg - person Yehudi; 03.10.2013
comment
@Yehudi Ты пробовал? Как упоминалось выше, это отправит SIGPIPE в ffmpeg. Это должно остановить его, как только шаблон будет найден. - person devnull; 03.10.2013
comment
Привет, devnull, ты прав, grep -q [MY_PATTERN] остановит ffmpeg. Но я надеюсь принять какое-то решение (одно из решений — остановить ffmpeg) в соответствии с включенной строкой MY_PATTERN. Как вы думаете, возможно ли обрабатывать stdin/stdout подпроцесса на bash? - person Yehudi; 03.10.2013
comment
@Yehudi Может помочь, если вы обновите вопрос сценариями. - person devnull; 03.10.2013
comment
@Yehudi Нет, это не так. Примеры могут помочь. - person devnull; 03.10.2013
comment
изменить снова, пример теперь выражает не только действие quit, но и другие действия, которые зависят от MY_PATTERN. - person Yehudi; 04.10.2013