Condicionalmente, matar um processo baseado em sua saída

3

Eu tenho um REPL (read-eval-print-loop) para a linguagem de programação Clojure que escuta em um soquete de rede. Posso enviar o código pela rede e o código será avaliado e a resposta será enviada de volta para mim. Estou usando o utilitário netcat para enviar o código

# send the contents of code.txt to port 5678 on somemachine
$ netcat somemachine 5678 <code.txt

Meu problema é que eu não quero usar o recurso Loop deste REPL. Do meu lado, eu quero emitir um comando one-shot, receber e mostrar a resposta no stdout, depois sair do meu comando (o REPL no computador remoto deve ficar ativo). O exemplo abaixo funciona, exceto que netcat não sai e permaneço conectado ao REPL indefinidamente.

$ cat code.txt
(doseq [x (range 0 10)] (println (* x x)))
$ netcat somemachine 5678 <code.txt
user=> 0
1
4
9
16
25
36
49
64
81
nil
user=>

Podemos ver que o prompt do REPL ("user = >") é exibido duas vezes: uma vez antes de o código ser avaliado e uma vez depois. Parece que a chave para conseguir o que eu quero é encadear algo no final do meu comando que vigia e aguarda até que o prompt seja mostrado uma segunda vez e depois mata netcat .

Ao executar isso manualmente em um terminal bash, eu poderia simplesmente pressionar Ctrl-C depois de ver o segundo prompt, mas o propósito disso é ser usado em uma extensão para o editor TextMate.

Alguma idéia?

    
por xyz 29.07.2011 / 00:50

1 resposta

1

Acho que as outras duas respostas provavelmente são melhores para o seu caso específico, mas para responder à sua pergunta geral, você pode resolver esse problema no final:

netcat somemachine 5678 <code.txt |
    while read ln;do 
      [ "${ln#user=>}" != "$ln" -a "$gotone" = true ] && exit
      [ "${ln#user=>}" != "$ln"  ] && gotone=true
      echo "$ln"
    done
    
por 22.08.2011 / 22:00