Por que o seguinte não funciona ?: enquanto verdadeiro; faça “$ my_command”; dormir 1; feito

2

Seguindo a resposta principal para esta questão , pensei que poderia:

1) Defina um comando:

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "arguments" $x; done'

2) Execute-o em um loop como segue

while true; do "$cmd"; sleep 1; done

No entanto, o acima não funciona, e eu recebo o seguinte

zsh: command not found for x in $(......
zsh: command not found for x in $(......
zsh: command not found for x in $(......
...

Alguma ideia do porquê?

Esclarecimento:

Se eu executar for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "arguments" $x; done' , isso funcionará perfeitamente.

Adendo:

Tenho notado que, se eu usar eval , isso funciona, por exemplo:

while true; do eval "$cmd"; sleep 1; done

executa o comando cmd a cada segundo

    
por Amelio Vazquez-Reina 26.10.2011 / 23:45

2 respostas

4

Ao colocar aspas em torno de $cmd , você está pedindo ao shell para executar um comando chamado exatamente isso. Não há comando chamado "para x em $ (..."; na verdade, no meu sistema, não há nem mesmo um comando chamado "para" - é uma palavra-chave shell. Para executar o conteúdo de $cmd , você ' Terá que usar eval .

    
por 27.10.2011 / 00:04
7

Se você quiser preparar um comando para executar dentro do mesmo shell, use uma função.

cmd () {
  for x in $(my_command | grep keyword | cut -d" " -f1); do
    command2 "arguments" $x
  done
}
while true; do cmd; sleep 1; done
    
por 27.10.2011 / 00:51