我有一个R脚本,可以从交互式bash外壳(MacOS Catalina)调用。这是我从交互式外壳程序调用的一系列脚本之一,因此我需要知道初始脚本是否失败。看来,无论脚本如何失败(assert_that,stop,stopfinot,quit),R始终返回退出状态0。如何从失败的R脚本返回非零存在状态?
这是一个示例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")
这就是我从bash提示符下调用它的方式
src/poc/fail.r
echo $?
无论我使用哪种方法退出R脚本$?始终返回0。
其他一些帖子解决了这个问题,但似乎不适用于我的情况(如何使Rscript以非交互式bash模式返回状态代码)和(使R以非零状态代码退出)
我可以使用将状态从Rscript返回到调用shell(在MacBook Pro上运行的R版本4.0.2,bash版本3.2.57或zsh版本5.8,macOS Mohave 10.14.6)q(status = N)
。要从失败的R脚本获取非零退出状态q(status = 2)
,请使用或更高版本,请参见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)
使用与您发布的脚本基本相同的脚本,我得到了预期的结果(状态从quit
成功地传递到了封闭的外壳程序):
脚本:
#!/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")
输出(使用上面显示的zsh和bash版本进行测试):
$ ~/test/test1.r
Starting script
$ echo $?
0
$ ~/test/test1.r
Starting script
$ echo $?
2
$ ~/test/test1.r
Starting script
$ echo $?
10
也可以看看:
R本身使用了一些错误状态值。非交互使用的默认错误处理程序有效地调用q(“ no”,1,FALSE)并返回错误状态1。错误状态2用于R'自杀',这是灾难性的失败,并且使用其他小数通过特定端口进行初始化失败。建议用户选择10个或更多状态。
状态的有效值取决于系统,但通常0:255是有效的。
(来自quit
文档)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句