base
интерпретируется как $(basename ${$f%.mp4}) ffmpeg -i $base.mp4
(как минимум), а не просто $(basename ${$f%.mp4})
.
Ленивый раствор
Добавьте точку с запятой:
for f in *.mp4; do base=$(basename "$f" .mp4); ffmpeg -i "$base.mp4" -vf "ass=$base.ass" "222$base.mp4"; done
Либо разбейте команду на несколько строк, чтобы отделить base
от команды. Я также внес некоторые дополнительные незначительные изменения, не связанные с основной проблемой (правильное цитирование, исправленное использование baseline
, потоковое копирование аудио вместо перекодирования).
Проверьте исходную команду / скрипт с помощью shellcheck для более подробного объяснения и решений.
Лучшее решение
Устранить посторонний процесс basename
и использовать вместо него расширение параметра вместо:
for f in *.mp4; do ffmpeg -i "$f" -vf "ass=${f%.*}.ass" -c:a copy "222${f%.*}.mp4"; done
Это эффективнее и короче.