Surveiller et agir conditionnellement sur la sortie de commande continue

1

En bash, j'ai une commande en cours d'exécution dans l'écran qui est effectivement

while true
do
  echo $RANDOM
  sleep 1
done

Le résultat est:

12396
19683
31641
...

Je voudrais canaliser cela dans quelque chose comme grep / awk et je correspond à un modèle spécifique, tel que 12345, je veux une commande à exécuter.

Je ne veux pas capturer le résultat complet de la commande en cours d'exécution - elle risque de s'exécuter très longtemps avant qu'une correspondance ne soit trouvée et je ne souhaite pas gaspiller de l'espace sur la machine.

Cela peut-il être fait facilement en Bash?

Dans un monde idéal, j'aimerais également que la sortie continue à être imprimée sur le terminal, afin que je puisse télécommander et surveiller la sortie moi-même, mais ce n'est pas strictement nécessaire.

Dave Mankoff
la source

Réponses:

1
./feeding_script.sh |
tee >(while read a; do [ "$a" == "12345" ] && </dev/null another_command; done)

Remarques:

  • teedivise le flux de données; une copie est envoyée dans un "fichier" qui est dans ce cas une commande >(…), l'autre continue au terminal;
  • </dev/null another_command- cette redirection empêche another_commandde consommer les données générées par feeding_script.sh.
Kamil Maciorowski
la source
Pourquoi le </dev/nullnécessaire, il partagerait le même stdin que le tee? Il semble que tout le temps et le test obtiennent l’entrée en premier, mais je ne suis pas trop sûr de ce qui se passe avec les substitutions de processus (ou ce qui se passe s’il another_commandprend beaucoup de temps et que les feeding_scriptdonnées sont sauvegardées)
Xen2050
@ Xen2050 Si another_commandpouvait se nourrir de stdin(sans redirection), il serait alors en mesure de consommer n'importe quel nombre de lignes qui suivent le déclenchement 12345. Ces lignes n'iraient jamais while read …. J'ai supposé qu'ils devraient tous y aller et être testés. Mais si l'idée est de détecter 12345comme un en- tête qui précède les données qui doivent aller à another_command, puis </dev/nullest faux.
Kamil Maciorowski