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
echo
na 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
.eval
faria 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.