Frage Gibt es eine Möglichkeit für R, ein Skript auszuführen und bei einem Fehler nicht 0 an die Shell zurückzugeben?


Eine Datei gegeben script.R enthält 3 Zeilen:

print('hello')
stop('user error')
print('world')

wir können es ausführen:

$ R -f script.R
> print('hello')
[1] "hello"
> stop('user error')
Error: user error
> print('world')
[1] "world" 

aber das geht nach dem Fehler weiter. Ich möchte, dass das Skript bei einem Fehler angehalten wird. Das macht das:

$ R -e "source('script.R')"
> source('script.R')
[1] "hello"
Error in eval(expr, envir, enclos) : user error
Calls: source -> withVisible -> eval -> eval

Gut. Es hat angehalten, das Skript für den Fehler auszuführen. Der Rückgabewert für die Shell ist jedoch 0 (Erfolg):

$ echo $?
0

Gibt es trotzdem ein Skript auszuführen, bei einem Fehler anhalten und nicht Null an die Shell zurückgeben? Ich suchte und konnte keine Antwort finden.

Ich könnte die Ausgabedatei für den Text "Fehler" grep aber das hat ein Risiko, das verwaltet werden muss; z.B. greping die falsche Ausgabedatei irgendwie und zwei oder mehr Läufe schreiben in die gleiche Datei. Diese Probleme können zwar gemanagt werden, aber die Rückgabe von Nicht-Null an die Shell wäre einfacher und robuster. Das Hinzufügen einer Zeile am Ende des Skripts ist ebenfalls eine Umgehungslösung, da ich diese Zeile allen Skripts hinzufügen muss.


5
2017-09-10 03:06


Ursprung


Antworten:


Dank @Pascal in Kommentaren stellte sich heraus, dass ich in meinem .Rprofile hatte:

options(error=quote(dump.frames()))

Wenn ich mit laufe --vanilla um zu verhindern, dass mein .Rprofil geladen wird:

$ R --vanilla -f script.R
> print('hello')
[1] "hello"
> stop('user error')
Error: user error
Execution halted
$ echo $?
1

Was genau ich wollte und löste das Problem. Danke @Pascal!


4
2017-09-10 03:35