Wie beendet man eine cli-app, wenn stdout eine bestimmte Zeichenfolge enthält?

378
Brad Parks

Ich habe eine Befehlszeilen-App, die viele Informationen an stdout ausgibt.

Wie kann ich das Programm beenden, wenn stdout eine bestimmte Zeichenfolge enthält?

zB etwas wie:

my_program | terminate_if_contains ERROR 

Der Grund, aus dem ich dies tun möchte, ist, dass das Programm von einem Drittanbieter geschrieben wurde und viele ERRORS an stdout ausgibt. Ich möchte jedoch beim ersten Fehler anhalten, sodass ich nicht warten muss, bis das Programm beendet ist.

1

2 Antworten auf die Frage

1
Brad Parks

Hier ist meine schnelle Lösung für dieses Problem:

Anwendungsbeispiele:

$ watch_and_kill_if.sh ERROR my_program 

watch_and_kill_if.sh

#!/usr/bin/env bash  function show_help() { IT=$(CAT <<EOF  usage: ERROR_STR YOUR_PROGRAM  e.g.   this will watch for the word ERROR coming from your long running program  ERROR my_long_running_program EOF ) echo "$IT" exit }  if [ "$1" == "help" ] then show_help fi if [ -z "$2" ] then show_help fi  ERR=$1 shift;  $* | while IFS= read -r line do echo $line if [[ $line == *"$ERR"* ]] then exit; fi done  if [ "$1" == "help" ] then show_help fi if [ -z "$2" ] then show_help fi  ERR=$1 shift;  $* | while IFS= read -r line do echo $line if [[ $line == *"$ERR"* ]] then exit; fi done 
1
John1024

Versuchen:

my_program | sed '/ERROR/q' 

Dies druckt alles bis einschließlich der ersten Zeile ERROR. An diesem Punkt wird sedgekündigt. Bald danach my_programwird ein Signal für ein unterbrochenes Pipe (SIGPIPE) empfangen, wodurch die meisten Programme angehalten werden.

nett! Ich wusste nicht über diese `/ q`-Option ... cool! Brad Parks vor 7 Jahren 1