Предотвращение дочернего процесса (HandbrakeCLI) от того, чтобы заставлять родительский сценарий выйти

У меня есть сценарий пакетного преобразования для превращения, .mkvs различных размеров в ipod/iphone измерил .mp4s, обрезая/масштабируя для удовлетворения. Определяя исходные размеры, требуемую обрезку, выходной файл все хорошо работает. Однако на успешном завершении первого преобразования, 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

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

5
задан Chris 25 April 2010 в 14:55
поделиться

1 ответ

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

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

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

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

6
ответ дан 14 December 2019 в 13:30
поделиться
Другие вопросы по тегам:

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