programa bash para executar algo quando a palavra-chave é vista no stdin

0

Suponha que eu tenha um executável que se conecte a uma máquina externa e produza um monte de coisas para stdout por muitos minutos. No final dessa saída, haverá uma palavra-chave como "STOP", ou o caractere EOF ou algo assim. Depois que a palavra-chave / EOF for impressa, o executável ficará lá, ainda executando, mas não enviando mais nenhuma saída. Não terminará por si só.

Agora eu quero canalizar a saída desse executável para um script bash que faz isso:

  1. Leia o que está sendo canalizado e escreva tudo no stdout.
  2. Quando você ver a palavra "STOP" (ou talvez o caractere EOF), mate o executável.

Eu posso usar o pkill para matar o executável. Eu poderia talvez usar alguma combinação de tee e grep, mas não vejo como fazer algo uma vez que recebo uma correspondência no grep.

    
por Eliot 10.05.2016 / 00:08

1 resposta

2

Dentro do próprio script, seria necessário um truque de redirecionamento:

#!/bin/bash

exec 1> >(tee >(awk '/STOP/{system("kill '"$$"'")}'))

while read line; do
  echo $line
  sleep 1
done

e daí:

bash-4.1$ (echo can; echo t; echo STOP; echo believing) | bash datscript

Outra opção pode ser expect , por ex. algo como

#!/usr/bin/env expect
spawn thatconnectingexecutablething
set timeout 7
expect {
  -ex "STOP" { exit 1 }
  eof { exit 1 }
  timeout { exit 1 }
  ...
}
    
por 10.05.2016 / 00:59