2016-08-04 16 views
1

Ich versuche, eine Shellfunktion zu schreiben, die die Funktion (aber nicht das Skript) beendet, wenn ein Fehler darin auftritt (insbesondere wenn ein aufgerufener Befehl einen Fehler zurückgibt), und einen Fehlercode an die aufrufende Funktion zurückgeben.Ich versuche, Trap zu verwenden, um aus einer Shell-Funktion auszubrechen

Als Beispiel für das Skript:

#!/bin/sh 
on_error() { 
    return 1 
} 

f() { 
    echo 'function f' 
    g 
    echo "g returned $?" 
} 

g() { 
    trap on_error ERR 
    echo 'function g' 
    false 
    echo "boo" 
} 

f 

Ich bin immer wieder:

$ ./cc 
function f 
function g 
boo 
g returned 0 

wenn ich möchte wieder bekommen werden:

$ ./cc 
function f 
function g 
g returned 1 

Was brauche ich zu tun, um das zu bekommen?

Wenn ich die on_error Funktion ändern 1 wie verlassen:

on_error() { 
    return 1 
} 

dann bekomme ich:

$ ./cc 
function f 
function g 

, um anzuzeigen, dass das gesamte Script beendet wird, wenn es geht an den ‚falschen‘ Befehl.

Während es in diesem Beispielfall möglich wäre, einfach den Fehlercode der Befehle in g zu überprüfen und einen Fehler zurückzugeben, wenn einer von ihnen fehlschlägt, möchte ich in meinem echten Fall versuchen, ein Dutzend zu kopieren oder mehr Dateien von verschiedenen Orten zu verschiedenen Zielen und stoppe das erste Mal, wenn einer von ihnen fehlschlägt, so dass ich einen Testfehler melden kann und zur nächsten Testfunktion übergehe.

Obwohl ich eine/bin/sh Lösung bevorzugen würde, wäre/bin/bash auch gut.

Antwort

1

Wollen Sie das? (Nur Bash.)

#!/bin/bash 

f() { 
    echo 'function f' 
    g 
    echo "g returned $?" 
} 

g() { 
    trap 'return 1' ERR 
    echo 'function g' 
    false 
    echo "boo" 
} 

f 
+0

Ja, danke. – Shadowfen

+0

Ich weiß noch nicht warum, aber 'Trap Return ERR' ist genug. – tomasz

+0

Es scheint einen Fehler bei der Rückgabe von Werten aus der Falle zu geben. "trap return ERR", "trap" return 1 "ERR" und "trap" return 50 "ERR" werden alle zurückgeben 1. Auf der anderen Seite kann ich eine 'trap' tun echo $ LINENO; return 1 "ERR ' und erhalten die Zeilennummer des falschen Befehls und eine Rückkehr von 0, obwohl es die Funktion ohne Echo "boo" beendet. – Shadowfen