У меня есть сценарий пакетного преобразования для превращения, .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
).
Теперь решено благодаря подсказке из этой другой ветки. Теперь я ничего не передаю в HandbrakeCLI, чтобы убедиться, что он не использует тот же стандартный ввод, что и мой скрипт:
find . -name "*.mkv" | while read FILE
do
echo "" | handbrake-touch "$FILE"
if [ $? != 0 ]
then
echo "$FILE had problems" >> errors.log
fi
done
... и работает так, как задумано / ожидалось.