2017-01-13 8 views
2

Ich möchte überprüfen, die Ausgabe von grep Befehl piped zu einem anderen Befehl. In meiner vorherigen question wurde PIPESTATUS vorgeschlagen, aber jetzt sehe ich, dass es nicht für alle Bedingungen funktioniert. Egal, was die Ausgabe von grep (Übereinstimmung oder Unmatch) ist, gibt PIPESTATUS 0 zurück, was seltsam ist.Überprüfen der Ausgabe eines piped Grep

Das Skript enthält

GF=`grep g09 $INP | cut -d ' ' -f2` 
if [ ${PIPESTATUS[0]} = 1 ]; then 

Grundsätzlich ist der erste Befehl sucht nach g09 in der Eingabedatei. Wenn es nicht existiert, sollte der PIPESTATUS 1 sein.

Jetzt set -x in dem Bash-Skript verklagt, ich sehe, dass für eine Eingabedatei, die g09 enthält, wird der Ausgang 0 ist und für eine Eingabe, die in ihm keine g09 hat, ist der Ausgang noch 0

++ grep g09 tor.sh 
++ cut -d ' ' -f2 
+ GF=hashe.gjf 
+ '[' 0 = 1 ']' 

und

Warum? Wie kann ich das beheben? Gibt es eine andere Lösung als PIPESTATUS?

+0

Bitte fügen Sie den vollständigen Code ein. – codeforester

+0

Wie Sie in der Ausgabe von 'set -x' sehen können, handelt es sich um eine Eingabedatei' tor.sh'. Es gibt zwei 'tor.sh' in zwei verschiedenen Verzeichnissen. Der vollständige Code ist möglicherweise groß, aber ich werde den Post aktualisieren – mahmood

+1

Die Backticks führen Ihre Befehle in einem separaten Prozess aus, weshalb die Umgebungsvariable für Ihr aufrufendes Skript nicht mehr verfügbar ist. –

Antwort

3

Warum?

Die Befehlsersetzung wird in einer Subshell ausgeführt. Wenn die Subshell beendet wird, füllt das Ergebnis ihres Status und überschreibt, was in der Subshell vorhanden war.

Wie kann ich das beheben?

Überprüfen Sie den PIPESTATUS in der Unterschale.

$(grep g09 $INPUT | cut -f2 -d' '; [[ 1 == $PIPESTATUS[0] ]] && { ... }) 
+0

Gut, dass {...} mehrere Zeilen enthält. Das war der Grund, warum ich den vollständigen Code nicht eingefügt habe (obwohl es unnötig ist). Gibt es nicht eine einfache Methode? – mahmood

2

Für Ihren Fall könnten Sie einfach überprüfen, ob der durch cut extrahierte Wert leer ist oder nicht.

+0

Das bedeutet leer oder nicht leer? – mahmood

+0

Überprüfung auf Leerheit, in Übereinstimmung mit der Tatsache, dass Sie nach dem 'grep's'-Exit-Code von 1 suchten. '[[-z $ GF]]' ist wahr, wenn GF leer ist (nicht gesetzt oder von Null Länge). – codeforester

+1

Nicht wirklich ... Eine einfachere Methode als PIPESTATUS ist auch in Ordnung. – mahmood