如何解决从bash调用R脚本时退出代码
我有一个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。
还有几篇文章解决了这个问题,但似乎不适用于我的情况(How to get an Rscript to return a status code in non-interactive bash mode和(Make R exit with non-zero status code)
解决方法
我可以使用q(status = N)
将状态从Rscript返回到调用shell(在MacBook Pro上运行的R版本4.0.2,bash版本3.2.57或zsh版本5.8,macOS Mohave 10.14.6)。要从失败的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
文档)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。