A gênese do problema que você está vendo se deve à forma como a tokenização acontece em uma linha de comando. Nesse caso em particular, muito antes de o $(echo 'echo | tac')
ser expandido, o shell já descobriu que você pretende executar um comando ( echo {…}
) e passar sua saída por meio de um canal ( |
) para outro comando ( xargs -n 2 $(…)
).
Em seguida, no próximo estágio, o preenchimento de $(…)
e a expansão de suporte {…}
geram os comandos reais a serem executados. E nesse estágio se resulta em um caractere de pipe, então, é tarde demais e é claramente perdido o ônibus.
Agora ele será tratado como não como um metacaractere especial, mas será incluído na linha de comando xargs
como qualquer caractere comum (= > não-metachar).
Se você quiser dar outra chance, precisará eval
.
eval "echo {0..9} | xargs -n 2 $(echo 'echo | tac')"
Isso produzirá o que você espera.