O u
sinalizador de expansão de parâmetro deve gerar apenas valores de matriz exclusivos. E isso acontece... às vezes.
$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c
O que da?
O u
sinalizador de expansão de parâmetro deve gerar apenas valores de matriz exclusivos. E isso acontece... às vezes.
$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c
O que da?
Em
echo ${(u)stuff}
,echo
são passados os 3 elementos únicos do array (os vazios elididos). Você está no contexto da lista, para os argumentos de um comando simples.Mas depois
<<<
que é um contexto não listado,cat
tem apenas um stdin,<<<
leva apenas uma coisa para armazenar no arquivo temporário que vai compor ocat
stdin, então os elementos do array são unidos com o primeiro caractere de$IFS
. O mesmo que em:Todos os casos em que apenas um argumento é esperado e mais não faria sentido.
Aqui, basta fazer:
Para que a
u
bandeira seja aplicada primeiro e a junção aconteça no nível externo.Igual em:
No entanto, você precisaria:
Para forçar o contexto da lista para a expansão interna e fazer a junção IFS na externa, para que um argumento seja passado para
printf
.Em vez de depender de um parâmetro global como
$IFS
, você pode querer especificar explicitamente como os elementos da matriz devem ser unidos:Consulte as Regras de Expansão para obter detalhes.