Solución:
Creo que es el orden de las expansiones:
El orden de las expansiones es:
brace
, expansión de tilde, parámetro,
expansion
variable
y expansión aritmética y sustitución de comandos (hecho de izquierda a derecha), división de palabras ypathname expansion
.
Entonces, si se sustituye su variable, la expansión de llaves ya no se lleva a cabo. Esto funciona para mi:
eval ls $dirs
Tenga mucho cuidado con eval. Ejecutará las cosas textualmente. Entonces, si dirs contiene f{m,k}t*; some_command
, some_command se ejecutará después de que ls termine. Ejecutará la cadena que le des a eval
en el shell actual. Pasara /content/dev01 /content/dev02
a ls, existan o no. Poniendo *
después de que las cosas lo conviertan en una expansión de nombre de ruta, y omitirá las rutas no existentes:
dirs=/content/{dev01,dev02}*
No estoy 100% seguro de esto, pero tiene sentido para mí.
Aquí hay una excelente discusión de lo que está tratando de hacer.
La respuesta corta es que quieres una matriz:
dirs=(/content/{dev01,dev01})
Pero lo que haces con los resultados puede volverse más complejo de lo que pretendías, creo.
Esto no es un globbing de nombre de archivo, es una expansión de llaves. La diferencia es sutil, pero existe: en el globbing de nombre de archivo, solo recibiría archivos existentes como resultado, mientras que en la expansión de llaves puede generar cualquier tipo de cadena.
http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion
http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion
Ahora, esto es lo que funcionó para mí:
#!/bin/sh
dirs=`echo ./{dev01,dev02}`
ls $dirs