while: comando não encontrado

6

Estou tentando fazer isso como uma pegadinha de primeiro de abril: faça uma máquina linux exibir uma mensagem no shell a cada alguns segundos.

Meu pensamento é conseguir isso iniciando um loop infinito que é executado como um job em background (em .bashrc).

Por exemplo, isso faz o que eu quero:

while true ; do echo Evil Message; sleep 10; done

Para executá-lo em segundo plano, tentei:

cmd="while true ; do echo Evil Message; sleep 10;"
$cmd &

mas isso falha com o erro:

while: command not found

Por que recebo o erro? Existe uma maneira de fazer este script funcionar?

    
por Cristian Lupascu 01.04.2015 / 11:05

2 respostas

16

while não é um comando, é uma palavra-chave do shell. As palavras-chave são reconhecidas antes que a expansão da variável aconteça, portanto, após a expansão, é tarde demais.

Você tem várias opções:

  1. Não use uma variável.

    while true ; do echo Evil Message; sleep 10; done &
    
  2. Use eval para executar o shell sobre o valor expandido da variável

    eval "$cmd" &
    
  3. Invoca um shell para executar o loop

    bash -c "$cmd" &
    
  4. Use uma função (normalmente usada para armazenar código):

    cmd() { while true ; do echo Evil Message; sleep 10; done; }
    cmd &
    
por 01.04.2015 / 11:14
2

Outra opção (além de todas as boas opções listadas na resposta da choroba) seria rodar em uma subshell, assim:

(while true; do echo Evil Message; sleep 10; done;) &

Isso fará com que bash execute outra instância de si mesmo executando seu código, em segundo plano.

    
por 01.04.2015 / 14:22