Se você der ao shell uma string de texto para executar, ele poderá fazê-lo se corresponder a um comando, como "ls" ( "ls -l" não é o nome de um comando).
-
Seu primeiro exemplo funciona porque o
echona execução do comando é executado pelo shell chamado, gerandobash -c "ls | wc -l". O pipeline é então executado porbash -c, o que é bom. -
O segundo, terceiro e quarto exemplo não funcionam, já que uma etapa extra de avaliação precisa acontecer na sequência de texto gerada
ls | wc -l.evalfaria isso por você.
O motivo "ls -l" ou "ls | wc -l" não funciona é que a remoção de cotação acontece após a divisão de palavras na avaliação da linha de comando.
A razão $(echo 'ls | wc -l') não funciona é que a substituição de comandos também ocorre após a divisão de palavras.