Предотвращение дочернего процесса (HandbrakeCLI) от выхода из родительского сценария - PullRequest
5 голосов
/ 25 апреля 2010

У меня есть скрипт пакетного преобразования, чтобы превратить .mkvs различных размеров в .mp4s размера ipod / iphone, обрезать / масштабировать в соответствии Определяя исходные размеры, требуемый кроп, выходной файл все работает нормально. Тем не менее, при успешном завершении первого преобразования, HandbrakeCLI вызывает выход родительского сценария. С чего бы это? И как я могу это остановить?

Код в его нынешнем виде:

#!/bin/bash
find . -name "*.mkv" | while read FILE
do
    # What would the output file be?
    DST=../Touch/$(dirname "$FILE")
    MKV=$(basename "$FILE")
    MP4=${MKV%%.mkv}.mp4

    # If it already exists, don't overwrite it
    if [ -e "$DST/$MP4" ]
    then
        echo "NOT overwriting $DST/$MP4"
    else

        # Stuff to determine dimensions/cropping removed for brevity

        HandbrakeCLI --preset "iPhone & iPod Touch" --vb 900 --crop $crop -i "$FILE" -o "$DST/$MP4" > /dev/null 2>&1

        if [ $? != 0 ]
        then
            echo "$FILE had problems" >> errors.log  
        fi
     fi
done

Я дополнительно попробовал это с ловушкой, но это не изменило поведение (хотя сработала последняя ловушка)

trap "echo Handbrake SIGINT-d"  SIGINT
trap "echo Handbrake SIGTERM-d" SIGTERM
trap "echo Handbrake EXIT-d"    EXIT
trap "echo Handbrake 0-d"       0

Отредактировано, чтобы добавить:

Тот факт, что ловушка '0' сработала, побудил меня выяснить, почему это может быть. Выполнение bash -x $script показало, что цикл find | while read заканчивается преждевременно.

Я пересмотрел поиск и кодировал в отдельные сценарии. Цикл поиска теперь:

find . -name "*.mkv" | while read FILE
do
    handbrake-touch "$FILE"

    if [ $? != 0 ]
    then
        echo "$FILE had problems" >> errors.log  
    fi
done

Поведение остается тем же - один код, за которым следует конец цикла while. Если я просто добавлю «echo $ FILE» вместо «ручного тормоза», все файлы будут перечислены. Текущий каталог не меняется (мне было интересно, что может сломать find | while).

1 Ответ

6 голосов
/ 25 апреля 2010

Теперь решено, благодаря подсказке от этой другой ветки. Теперь я ничего не отображаю в HandbrakeCLI, чтобы убедиться, что он не использует тот же стандартный ввод, что и мой скрипт:

find . -name "*.mkv" | while read FILE
do
    echo "" | handbrake-touch "$FILE"

    if [ $? != 0 ]
    then
        echo "$FILE had problems" >> errors.log  
    fi
done

... и работает как задумано / ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...