Скрипт 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' 
Другие вопросы по тегам