Сценарий bash выполняет ранний выход из цикла
Я расстраиваюсь. Я написал сценарий, который должен читать файл построчно и выполнять операцию на основе этой строки. В частности, я использую интерфейс командной строки ручного тормоза для преобразования частичного каталога (на основе списка файлов) в другой меньший формат. Я тестировал сценарий, используя "echo" для командной строки, чтобы запустить его всухую, но когда я действительно хочу запустить сценарий, он запускает команду только для первого элемента в списке, а затем завершает работу. Вот код:
#!/bin/bash
if [ "$1" != "" ]; then
SRC="$1"
else
echo "No File List Specified"
exit
fi
if [ "$2" != "" ]; then
DEST="$2"
else
echo "No Destination Path Specified"
exit
fi
DEST_EXT=mp4
HANDBRAKE_CLI=HandBrakeCLI
profile="Very Fast 720p"
while read -r FILE
do
echo "Next file is $FILE"
if [ -f "$FILE" ]; then
filename=$(basename "$FILE")
extension=${filename##*.}
newfilename=${filename%.*}
newfullname="$newfilename.$DEST_EXT"
if [ ! -f "$newfilename.$DEST_EXT" ]; then
HandBrakeCLI -v --preset-import-gui "/home/master/Very Fast 720p.json" -Z "Very Fast 720p" -i "$FILE" -o "$DEST"/"$newfullname"
fi
fi
echo "Moving to Next File"
done < "$SRC"
Вот список файлов:
/mnt/raid/public/Movies/The Lost World - Jurassic Park 2.mkv
/mnt/raid/public/Movies/Jurassic Park.mkv
/mnt/raid/public/Movies/Frozen 2 (2019) - 1080p.mkv
/mnt/raid/public/Movies/ALITA - BATTLE ANGEL (2019) - 1080p.mkv
/mnt/raid/public/Movies/How To Train Your Dragon 3 - 1080p.mkv
/mnt/raid/public/Movies/Star Wars Ep VI - Return of the Jedi (1983) - 4K83.mkv
/mnt/raid/public/Movies/Star Wars (1977) - 4K77.mkv
/mnt/raid/public/Movies/Star Wars (1977) - Despecialized.mkv
/mnt/raid/public/Movies/Star Wars Ep VI - Return of the Jedi (1983) - Despecialized.mkv
/mnt/raid/public/Movies/The Empire Strikes Back (1980) - Despecialized.mkv
/mnt/raid/public/Movies/Scary Stories to Tell in the Dark.mkv
/mnt/raid/public/Movies/National Lampoon's Christmas Vacation 1989.mkv
/mnt/raid/public/Movies/How To Train Your Dragon 3.mkv
/mnt/raid/public/Movies/Logan.mkv
/mnt/raid/public/Movies/BRAM STOKER'S DRACULA.mkv
/mnt/raid/public/Movies/The Crow.mkv
/mnt/raid/public/Movies/Jurassic World - Fallen Kingdom.mkv
/mnt/raid/public/Movies/TOP GUN.mkv
/mnt/raid/public/Movies/PREDATOR.mkv
/mnt/raid/public/Movies/LOGANS RUN.mkv
/mnt/raid/public/Movies/V for Vendetta.mkv
/mnt/raid/public/Movies/Happiness is a Warm Blanket Charlie Brown.mkv
/mnt/raid/public/Movies/The Neverending Story.mkv
Вот результат, когда я помещаю "echo" перед командой:
Next file is /mnt/raid/public/Movies/Jurassic Park 3.mkv
HandBrakeCLI -v --preset-import-gui /home/master/Very Fast 720p.json -Z Very Fast 720p -i /mnt/raid/public/Movies/Jurassic Park 3.mkv -o /mnt/raid/public/Movies/CarVideo/Jurassic Park 3.mp4
Moving to Next File
Next file is /mnt/raid/public/Movies/The Lost World - Jurassic Park 2.mkv
HandBrakeCLI -v --preset-import-gui /home/master/Very Fast 720p.json -Z Very Fast 720p -i /mnt/raid/public/Movies/The Lost World - Jurassic Park 2.mkv -o /mnt/raid/public/Movies/CarVideo/The Lost World - Jurassic Park 2.mp4
Moving to Next File
Next file is /mnt/raid/public/Movies/Jurassic Park.mkv
etc
Но когда я удаляю эхо и требуемые кавычки, ручной тормоз выполняется только для первого файла, а затем весь скрипт завершается. Я не понимаю, как это могло происходить, поскольку пробный прогон последовательно выплевывает правильные команды по мере прохождения цикла do. Я попытался поставить ожидание после команды CLI Handbrake, и это, казалось, помогло, когда я прервал (ctl-c во время кодирования) скрипт, но если позволить кодированию пройти весь путь, это привело к тому же поведению (завершение скрипта).
У кого-нибудь есть идеи?
2 ответа
Похоже на предложение Гордона Дэвиссона
Try sending the list over FD #3 instead of stdin with while read -r FILE <&3 and done 3< "$SRC". See BashFAQ #89. – Gordon Davisson 10 hours ago
Решил вопрос. Скрипт работал всю ночь. Спасибо за помощь.
Так как ваши имена файлов содержат пробелы, попробуйте изменить форматирование строки на:
filename="$(basename \"$FILE\")"
extension="${filename##*.}"
newfilename="${filename%.*}"
newfullname="$newfilename.$DEST_EXT"
Я только что добавил двойные кавычки. Я не уверен, что это решит вашу проблему, но у меня была аналогичная проблема, и это помогло.