2013-07-19 10 views
11

Gibt es eine ähnliche Option in der Dash Shell, die dem Pipefail in bash entspricht?Entsprechung von Pipefail in Dash Shell

Oder eine andere Möglichkeit, einen Nicht-Null-Status zu erhalten, wenn einer der Befehle in der Pipe fehlschlägt (aber nicht darauf, welcher Satz -e würde).

es deutlicher zu machen, hier ist ein Beispiel dafür, was ich erreichen möchte:

In einer Probe Debuggen Make-Datei, sieht meine Regel wie folgt aus:

set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi; 

Im Grunde läuft es öffnet die Fehlerdatei und Quelldatei bei Fehler und führt die Programme aus, wenn kein Fehler vorliegt. Spart mir etwas tippen. Über Snippet funktioniert gut auf bash, aber mein neuere Ubunty-System verwendet das Dash, das die Option pipefail nicht zu unterstützen scheint.

Ich mag im Grunde einen Fehlerstatus, wenn der erste Teil der folgenden Gruppe von Befehlen fehlschlagen:

gcc -Wall $$f.c -o $$f 2>&1 | tee err 

so, dass ich das für die IF-Anweisung verwenden kann.

Gibt es alternative Möglichkeiten, dies zu erreichen?

Danke!

+1

Warum nicht einfach von der 'tee' loswerden? 'if gcc -Wall $$ f.c -o $$ f> $$ f.log 2> & 1; dann Katze $$ f.log; ./$$f; sonst vim -o $$ f.c $$ f.log; fi '(Alternativ installieren Sie' bash 'auf Ubunty. Es ist nur ein apt-get weg.) – rici

+0

@rici Vielen Dank! Ich benutzte Tee, weil ich auch wollte, dass die stderr-Ausgabe auf dem Bildschirm gedruckt wurde - hauptsächlich um zu sehen, ob es irgendwelche Warnungen gab. Aber wenn es keinen anderen Weg gibt, werde ich wahrscheinlich zu dem wechseln, was Sie vorgeschlagen haben. Über die Installation von bash: Ich hatte (ohne jegliche Nachforschungen) angenommen, dass Dash ein Schritt vorwärts von Bash ist, also wollte ich nicht zurückschalten, aber jetzt googeln ein bisschen darüber scheint, dass das nicht unbedingt so sein muss. Ich werde ein wenig mehr über die Unterschiede lesen und dann entscheiden. Nochmals vielen Dank für Ihre Hinweise! – Lavya

+1

Ich hatte gehofft, dass das Set -e, das oben erwähnt wurde, mir ein Dash-Äquivalent von Set -o-Pipefail liefern würde, aber nicht so: '$ dash -c 'set -e; falsch | Katze'; echo $? $ ' –

Antwort

6

Die "Lager" Antwort für POSIX-Implementierungen von PIPESTATUS/pipefail ist in den comp.unix.shell FAQ Q11

+3

Dies beantwortet die Frage nicht. In diesem Dokument wird beschrieben, wie der Exit-Code von Piped-Befehlen in separate Variablen eingefügt wird. Aber das ist ziemlich weit von der Frage entfernt, die die Shell automatisch verlassen möchte, sobald ein Piped-Befehl fehlschlägt. "RTFM" ist nur gültig, wenn "FM" die Frage tatsächlich beantwortet. – vog