Code de sortie lors de l'appel du script R à partir de bash
J'ai un script R que j'appelle depuis un shell bash interactif (MacOS Catalina). C'est l'un d'une série de scripts que j'appelle depuis le shell interactif, j'ai donc besoin de savoir si le script initial a échoué. Il semble que peu importe la façon dont le script échoue (assert_that, stop, stopfinot, quit), R renvoie toujours un statut de sortie de 0. Comment puis-je retourner un statut d'existence différent de zéro à partir d'un script R échoué?
Voici un exemple de script R (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")
Et voici comment je pourrais l'appeler à partir d'une invite de bash
src/poc/fail.r
echo $?
Quelle que soit la méthode que j'utilise pour quitter le script R $? renvoie toujours 0.
Quelques autres articles traitent de ce problème, mais ne semblent pas s'appliquer à ma situation ( Comment obtenir un Rscript pour renvoyer un code d'état en mode bash non interactif ) et ( Faire quitter R avec un code d'état différent de zéro )
Réponses
Je peux récupérer l'état de Rscript vers le shell appelant (R version 4.0.2, bash version 3.2.57 ou zsh version 5.8 fonctionnant sur un MacBook Pro, macOS Mohave 10.14.6) en utilisant q(status = N). Pour obtenir un statut de sortie différent de zéro à partir d'un script R ayant échoué, utilisez q(status = 2)ou une version ultérieure, voir 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)
En utilisant un script essentiellement identique à celui que vous avez posté, j'obtiens les résultats attendus (le statut de quitest passé avec succès au shell englobant):
Scénario:
#!/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")
Sortie (testé avec les versions zsh et bash illustrées ci-dessus):
$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?
2
$ ~/test/test1.r Starting script $ echo $?
10
VOIR ÉGALEMENT:
Certaines valeurs d'état d'erreur sont utilisées par R lui-même. Le gestionnaire d'erreurs par défaut pour une utilisation non interactive appelle effectivement q ("non", 1, FALSE) et renvoie l'état d'erreur 1. L'état d'erreur 2 est utilisé pour R 'suicide', c'est-à-dire un échec catastrophique, et d'autres petits nombres sont utilisés par des ports spécifiques pour les échecs d'initialisation. Il est recommandé aux utilisateurs de choisir des statuts de 10 ou plus.
Les valeurs d'état valides dépendent du système, mais 0: 255 sont normalement valides.
(À partir de la quitdocumentation)