Эта проблема очень специфична bash, и это потому, что они решили bashотделить расширение фигурной скобки от расширения имени файла (globbing) и выполнить его в первую очередь, перед всеми другими расширениями.
Из bashсправочной страницы:
Порядок разложений: раскладывание скобок; раскрытие тильды, расширение параметров и переменных, арифметическое расширение и подстановка команд (выполняется слева направо); расщепление слов; и расширение пути.
В вашем примере bashваши фигурные скобки будут видны только после выполнения подстановки команды (the $(echo ...)), когда будет слишком поздно.
Это отличается от всех других оболочек, которые выполняют расширение фигурной скобки непосредственно перед (а некоторые даже как часть) расширением пути (globbing). Это включает, но не ограничивается тем, cshгде были впервые разработаны скобки-расширения.
$ csh -c 'ls `echo "test{1,2}.txt"`'
test1.txt test2.txt
$ ksh -c 'ls $(echo "test{1,2}.txt")'
test1.txt test2.txt
$ var=nope var1=one var2=two bash -c 'echo $var{1,2}'
one two
$ var=nope var1=one var2=two csh -c 'echo $var{1,2}'
nope1 nope2
Последний пример является одинаковым в csh, zsh, ksh93, mkshили fish.
Кроме того, обратите внимание, что расширение скобок как часть globbing также доступно через glob(3)библиотечную функцию (по крайней мере, в Linux и всех BSD) и в других независимых реализациях (например, в perl:) perl -le 'print join " ", <test{1,2}.txt>'.
Почему это было сделано по-другому bash, вероятно, есть история, но я не смог найти никакого логического объяснения, и я считаю, что все последующие объяснения неубедительны.