Beenden Sie den Code, wenn Sie das R-Skript von bash aus aufrufen
Ich habe ein R-Skript, das ich über eine interaktive Bash-Shell (MacOS Catalina) aufrufe. Dies ist eines aus einer Reihe von Skripten, die ich über die interaktive Shell aufrufe. Daher muss ich wissen, ob das ursprüngliche Skript fehlgeschlagen ist. Unabhängig davon, wie das Skript fehlschlägt (assert_that, stop, stopfinot, quit), gibt R immer einen Exit-Status von 0 zurück. Wie kann ich einen Status ungleich Null von einem fehlgeschlagenen R-Skript zurückgeben?
Hier ist ein Beispiel für ein R-Skript (fail.r).
#!/usr/bin/env Rscript
#library(assertthat)
message("Starting script")
#assert_that(FALSE)
#stop('Fail')
#stopifnot(FALSE)
q(save="no", status=10, runLast=FALSE)
message("Should not reach here")
Und so könnte ich es von einer Bash-Eingabeaufforderung aus aufrufen
src/poc/fail.r
echo $?
Unabhängig von der Methode, mit der ich das R-Skript $? Beende. gibt immer 0 zurück.
Einige andere Beiträge befassen sich mit diesem Problem, scheinen jedoch nicht auf meine Situation zuzutreffen ( So erhalten Sie ein Rscript, um einen Statuscode im nicht interaktiven Bash-Modus zurückzugeben ) und ( Lassen Sie R mit einem Statuscode ungleich Null beenden )
Antworten
Ich kann den Status von Rscript mit auf die aufrufende Shell (R-Version 4.0.2, Bash-Version 3.2.57 oder zsh-Version 5.8, die auf einem MacBook Pro, macOS Mohave 10.14.6 ausgeführt wird) zurückholen q(status = N). Verwenden Sie q(status = 2)oder höher, um einen Exit-Status ungleich Null von einem fehlgeschlagenen R-Skript zu erhalten , siehe quit:
$ Rscript -e 'q(status = 0);' $ echo $? 0 $ Rscript -e 'q(status = 2);'
$ echo $?
2
$ Rscript -e 'q(status = 10);' $ echo $? 10 $ R --version
R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)
$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) $ zsh --version
zsh 5.8 (x86_64-apple-darwin17.7.0)
Mit einem Skript, das im Wesentlichen mit dem von Ihnen veröffentlichten identisch ist, erhalte ich die erwarteten Ergebnisse (der Status von quitwird erfolgreich an die umschließende Shell übergeben):
Skript:
#!/usr/bin/env Rscript
message("Starting script")
## Use status = 0, 2 or 10:
q(save = "no", status = 2, runLast = FALSE)
message("Should not reach here")
Ausgabe (getestet mit den oben gezeigten zsh- und bash-Versionen):
$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?
2
$ ~/test/test1.r Starting script $ echo $?
10
SIEHE AUCH:
Einige Fehlerstatuswerte werden von R selbst verwendet. Die Standardfehlerbehandlungsroutine für die nicht interaktive Verwendung ruft effektiv q ("no", 1, FALSE) auf und gibt den Fehlerstatus 1 zurück. Der Fehlerstatus 2 wird für R "Selbstmord" verwendet, dh ein katastrophaler Fehler, und andere kleine Zahlen werden verwendet durch bestimmte Ports für Initialisierungsfehler. Es wird empfohlen, dass Benutzer einen Status von 10 oder mehr wählen.
Gültige Statuswerte sind systemabhängig, aber normalerweise sind 0: 255 gültig.
(Aus quitDokumenten)