Эта проблема очень специфична 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
, вероятно, есть история, но я не смог найти никакого логического объяснения, и я считаю, что все последующие объяснения неубедительны.