Você não pode armazenar uma lista de nomes de arquivos em inputs
desta maneira: inputs
é uma string, você não pode distinguir os espaços e '
que vêm de um nome de arquivo e os que você adicionou para a cadeia.
A propósito, inputs="$inputs -i ""'""$file""'"
é uma maneira confusa de escrever inputs="$inputs -i '$file'"
(ou seja, acrescentar um espaço, -i
, um espaço, uma aspa simples, o nome do arquivo e outra aspa simples).
Seu comando echo
imprime um comando shell válido porque você tentou em nomes de arquivos que não contêm caracteres especiais (em particular, sem aspas simples - com relação à parte $inputs
, todos os outros caracteres seriam ok ). Sem echo
, você está executando
ffmpeg "$inputs -r 29.97 -f mov -vcodec libx264 -acodec pcm_s16le -threads 0 -filter_complex '${filter}concat=n=$count:v=1:a=2 [v] [a1] [a2]'" \
-map \'[v]\' -map \'[a1]\' -map \'[a2]\' \'$item\.MOV\'
(simplifiquei as aspas redundantes). Observe como toda a string até [a1] [a2]
é um único argumento.
Para armazenar vários argumentos para um comando, use uma matriz. Quando você executa o comando, use aspas duplas em torno de todas as substituições de variáveis ( "$foo"
ou para uma matriz "${foo[@]}"
). Não coloque aspas ao redor daspas, caso contrário você está passando o caractere de aspas literal para o comando ffmpeg
.
inputs=()
…
inputs+=(-i "$file")
…
ffmpeg "${inputs[@]}" -r 29.97 -f mov \
-vcodec libx264 -acodec pcm_s16le -threads 0 \
-filter_complex "${filter} concat=n=$count:v=1:a=2 [v] [a1] [a2]" \
-map '[v]' -map '[a1]' -map '[a2]' "$item.MOV"
Note que você não está passando nenhuma aspas simples para qualquer subshell (você nem está executando um subshell). As citações estão lá para a análise do seu script, sem citações são passadas para qualquer comando.