Respuestas:
Parece que bash no usa $ IFS para unir las palabras generadas. Otra técnica sería almacenar las palabras generadas en una matriz y luego $ IFS estará en juego:
Voy a usar un subshell para no alterar el IFS de este shell: elija uno de
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Eso emite la cadena separada por comas a stdout. Si quieres capturarlo:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Estoy seguro de que hay muchas maneras de lograr esto. Aquí hay un método:
echo a{b,c,d} | sed 's/ /,/g'
Expanda los elementos como mostró y luego repítelos, agregando la coma a todos menos a la primera iteración:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Resultado:
ab, ac, ad
Aquí hay una solución solo para bash.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
La parte anterior al punto y coma se asigna ab ac ad
a la variable IN
y la segunda parte utiliza la búsqueda y reemplazo para cambiar todos los espacios a comas. El //
significa que todos los partidos, no sólo el primero.
Hágalo todo en un subshell (los paréntesis adjuntos) para no contaminar su espacio de nombres.
Vale la pena señalar que en muchos contextos, una coma final es aceptable en dicha lista. SI una coma final es aceptable, la forma más fácil de manejar la sustitución es printf
:
some-command "$(printf %s, a{b,c,d} )"
(¿Dónde some-command
está un comando que se ejecuta en una lista separada por comas y no le importa una coma final?)
En realidad, incluso si no debe tener una coma final, puede usarla printf
; solo necesita especificar el número de argumentos que espera, lo que lo hace más torpe para listas muy largas:
some-command "$(printf %s,%s,%s a{b,c,d} )"