У меня есть скрипт пакетного преобразования, чтобы превратить .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
).