Bash - por que eu posso executar uma string de comando com pipelines apenas por meio de “bash -c”?

1

O exemplo de código abaixo mostra o problema:

bash -c "$(echo 'ls | wc -l')" # Working
"$(echo 'ls | wc -l')"         # Not working
$(echo 'ls | wc -l')           # Not working
'ls | wc -l'                   # Not working
'ls'                           # Working
ls | wc -l                     # Obviously working

O que estou perdendo aqui?

    
por Denis Sheremet 22.04.2017 / 08:53

1 resposta

2

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, gerando bash -c "ls | wc -l" . O pipeline é então executado por bash -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.

    
por 22.04.2017 / 09:38