Скрипт Bash ffmpeg рис для видео не работает, но работает в командной строке
Это работает в командной строке для последовательности jpg, чтобы преобразовать в видео.
cat *.jpg | ffmpeg -f image2pipe -framerate 5 -i - -s 1280x720 ./HD720_out.mp4
но не работает (за исключением первого jpg) в исполняемом скрипте temp.sh, содержащем:
eval cat "$1" | ffmpeg -f image2pipe -framerate 5 -i - -s 1280x720 "./HD720_out.mp4"
например ./temp.sh *.jpg
дает только первый файл для видео, а не последовательность. Что я делаю неправильно? Командная строка работает отлично.
1 ответ
Упрощенная: $1
расширяется до первого аргумента командной строки скрипта.
Но перед тем, как ваш скрипт интерпретирует оболочку, запущенная temp.sh сначала раскроет звездочку * в ./temp.sh *.jpg
, эффективно приводящий к командной строке:
./temp.sh first.jpg second.jpg third.jpg
\
\_ $1
У вас есть два варианта, чтобы обойти это. Первый (и предпочтительный):
cat "$@" | ...
просто будет использовать все параметры командной строки, а не только первый. Вам не нужно eval
для этого и не следует его использовать.
Второй (где eval
вступает в игру):
eval cat "$1" |
при вызове скрипта с параметрами в кавычках, чтобы избежать расширения:
./temp.sh '*.jpg'