Codice di uscita quando si chiama lo script R da bash
Ho uno script R che chiamo da una shell bash interattiva (MacOS Catalina). Questo è uno di una serie di script che chiamo dalla shell interattiva, quindi ho bisogno di sapere se lo script iniziale non è riuscito. Sembra che non importa come lo script fallisca (assert_that, stop, stopfinot, quit), R restituisce sempre uno stato di uscita di 0. Come posso restituire uno stato di esistenza diverso da zero da uno script R fallito?
Ecco uno script R di esempio (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")
Ed ecco come potrei chiamarlo da un prompt di bash
src/poc/fail.r
echo $?
Indipendentemente dal metodo che utilizzo per uscire dallo script R $? restituisce sempre 0.
Un paio di altri post risolvono questo problema, ma non sembrano essere applicabili alla mia situazione ( Come ottenere un Rscript per restituire un codice di stato in modalità bash non interattiva ) e ( Fai uscire R con codice di stato diverso da zero )
Risposte
Posso ottenere lo stato da Rscript alla shell chiamante (R versione 4.0.2, bash versione 3.2.57 o zsh versione 5.8 in esecuzione su un MacBook Pro, macOS Mohave 10.14.6) usando q(status = N). Per ottenere uno stato di uscita diverso da zero da uno script R non riuscito, utilizzare q(status = 2)o superiore, vedere 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)
Utilizzando uno script essenzialmente identico a quello che hai pubblicato, ottengo i risultati attesi (lo stato da quitviene passato con successo alla shell che lo racchiude):
Script:
#!/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")
Output (testato con le versioni zsh e bash mostrate sopra):
$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?
2
$ ~/test/test1.r Starting script $ echo $?
10
GUARDA ANCHE:
Alcuni valori di stato di errore vengono utilizzati da R stesso. Il gestore degli errori predefinito per l'uso non interattivo chiama effettivamente q ("no", 1, FALSE) e restituisce lo stato di errore 1. Lo stato di errore 2 è usato per R 'suicidio', cioè un errore catastrofico, e vengono usati altri piccoli numeri da porte specifiche per errori di inizializzazione. Si consiglia agli utenti di scegliere gli stati di 10 o più.
I valori validi dello stato dipendono dal sistema, ma normalmente sono validi 0: 255.
(Da quitdocumenti)