Ese problema es muy específico bash
y es porque decidieron bash
separar la expansión de la llave de la expansión del nombre de archivo (globbing) y realizarla primero, antes de todas las otras expansiones.
Desde la página del bash
manual:
El orden de las expansiones es: expansión de llaves; expansión de tilde, expansión de parámetros y variables, expansión aritmética y sustitución de comandos (hecho de izquierda a derecha); división de palabras; y expansión de nombre de ruta.
En su ejemplo, bash
solo verá sus llaves después de haber realizado la sustitución del comando (the $(echo ...)
), cuando sea demasiado tarde.
Esto es diferente de todos los otros shells, que realizan la expansión de llaves justo antes (y algunos incluso como parte de) la expansión del nombre de ruta (globbing). Eso incluye, pero no se limita a, csh
dónde se inventaron las expansiones de llaves.
$ 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
Este último ejemplo es el mismo en csh
, zsh
, ksh93
, mksh
o fish
.
Además, observe que la expansión de llaves como parte de globbing también está disponible a través de la glob(3)
función de biblioteca (al menos en Linux y todos los BSD), y en otras implementaciones independientes (por ejemplo, en perl:) perl -le 'print join " ", <test{1,2}.txt>'
.
Por qué eso se hizo de manera diferente bash
probablemente tenga una historia detrás, pero FWIW no pude encontrar ninguna explicación lógica, y encuentro que todas las racionalizaciones post-hoc no son convincentes.