Piping para a substituição do comando de uma string contendo pipes

5

Isso funciona -

$ x='grep a'
$ echo ab | $x
ab

Isso não acontece -

$ x='grep a | grep b'
$ echo ab | $x
grep: |: No such file or directory
grep: grep: No such file or directory
grep: b: No such file or directory

Aparece no último caso, grep a | grep b é visto como um único comando, isto é, grep a \| grep b .

Como obtenho o segundo exemplo para funcionar sem modificar x ?

    
por Andrew Cheong 10.01.2014 / 18:47

2 respostas

5

Quando você quiser executar variáveis que contenham código, muitas vezes você vai querer usar o comando eval . Isso expandirá o conteúdo da variável para que ela possa ser executada.

Exemplo

$ x='grep a | grep b'
$  echo ab | eval $x
ab

O uso de eval é muitas vezes desencorajador, portanto, tenha cuidado, veja este BashFAQ intitulado: Questões de comando e segurança do Eval para mais informações exemplos!

Referências

por 10.01.2014 / 19:54
1

Ah, eu descobri depois de algumas experiências - use alias -

$ x='grep a | grep b'
$ alias y=$x
$ echo ab | y
ab

Por favor, publique outras maneiras de fazer isso - eu estaria interessado em alternativas.

    
por 10.01.2014 / 19:09