Os parênteses são especiais para o shell, você precisa citá-los.
$ title=foo; filename=bar
$ youtube="youtube-dl -prefer-ffmpeg -o $title.%(ext)s ${filename}"
$ eval echo $youtube
bash: syntax error near unexpected token '('
$ youtube="youtube-dl -prefer-ffmpeg -o $title.%\(ext\)s ${filename}"
$ eval echo $youtube
youtube-dl -prefer-ffmpeg -o foo.%(ext)s bar
Ou, de preferência, salve o comando em uma função em vez de uma variável de string, algo assim:
ydl() {
youtube-dl -prefer-ffmpeg -o "$1.%(ext)s" "$2"
}
ydl "$title" "$filename"
(exceto, é claro, que o método eval
avalia title
e filename
quando a string é definida, não quando o comando é executado.)