2017-08-01 1 views
3

Dies ist eine Follow-up-Frage zu meinem last question auf Stack-Überlauf. Ich werde das Skript auf die wesentlichen Teile reduzieren, aber wenn s.o. denkt, es könnte hilfreich sein zu wissen, was das Skript macht, Sie können sich die andere Frage ansehen.Bash-Skript beendet unerwartet nach der Rückkehr von Funktion

#!/usr/bin/env bash 
set -eu -o pipefail 

declare -a framelist 


#Print all results 

function output_values() { 
    echo "Results!"; 
} 

#parsing information from stdin 

function parser() { 

    while read tc; 
    do 

     if [ -z "$tc" ]; then 
     continue 
     fi 

     #Evaluation and saving result to array 

     echo $result_value; 

     framelist+=($result_value); 

     if ((<<some abort condition>>)); then 
     exec 0>&- 
     echo "Last result: $result_value"; 
     return 0 
     fi 

    done 
} 

some_command_writing_to_stdout | parser $2; 
output_values; 

Das Skript führt den Befehl aus und die Ausgabe über Pipes zu meiner lokalen Funktion, die schließlich ein Ergebnis auf der Linie gibt echo "Last result: $result_value"; wie es beabsichtigt ist, zu tun. Danach soll es den Befehl beenden, der die Daten liefert, die in dieser Funktion analysiert werden - das funktioniert auch.

Wenn ich return 0 erreiche, würde ich denken, die nächste Zeile des Skripts (rechts unterhalb des Befehls) output_values; sollte ausgeführt werden, ist es aber nicht.

Auch wenn ich die Funktion output_values ​​direkt vor der Echozeile aufruft, die das Ergebnis in der Parserfunktion ausgibt, wird es nicht ausgeführt.

Es wird noch seltsamer, wie ich exec 0>&- auskommentieren kann und alles verhält sich genauso. Selbst der Befehl, der durch diese Zeile beendet werden soll, wird beendet, sobald die Parser-Funktion beendet wird.

Was muss ich ändern, um mit den Ergebnissen meiner Parser-Funktion nach der Rückkehr arbeiten zu können? Dies kann kein beabsichtigtes Verhalten sein.

Grüße

Manuel

+0

Post ein Beispielcode, die einfach ist, zu arbeiten und produzieren die genaue Versagen – Anubis

+0

Haben Sie versucht, 'set -x'? –

+0

'set -x' zeigt nur das Beenden nach 'return 0' und danach wird nichts mehr ausgeführt. –

Antwort

4

Lassen Sie uns bei man bash einen Blick Abschnitt auf pipefail:

pipefail

Wenn gesetzt, ist der Rückgabewert einer Pipeline ist die Wert des letzten (ganz rechts) Befehls, um mit einer Nummer zu beenden N-Null-Status oder Null, wenn alle Befehle in der Pipeline erfolgreich beendet werden. Diese Option ist standardmäßig deaktiviert.

In Kombination mit set -e, die verlassen wird, wenn ein Befehl (Pipeline) mit Nicht-Null-Exit-Status verlassen hat, ist die einzige logische Schlussfolgerung: Ihre some_command_writing_to_stdout muss mit einem Nicht-Null-Exit-Status werden Verlassen (weil offensichtlich existieren parser mit 0).

Dies würde erklären, warum der nächste Befehl in der Pipeline (parser) ausgeführt wird und warum Ihr Skript danach beendet wird.

Es ist einfach genug, dies zu überprüfen. Ersetzen Sie einfach die vorletzte Anweisung mit:

(some_command_writing_to_stdout || true) | parser $2 
+0

Sie sind absolut richtig. Ich habe die Pipefail-Option auskommentiert und es funktioniert. Ich hätte erwartet, Informationen über den Exit-Code! = 0 zu erhalten, der die Ursache für das sofortige Verlassen des Skripts bei Verwendung von 'set -x' ist. –

+0

Erhalten Sie nicht den Exit-Code für 'some_command_writing_to_stdout'? – randomir

+0

Das Skript gibt die Werte aus, die es beim Analysieren der pipeed stdout-Daten und der Zeile "last result" erhält. Die Verwendung von 'set -x' liefert nicht mehr Informationen als die zuletzt ausgeführte Zeile 'return 0'. –

Verwandte Themen