首页 > 解决方案 > 如何让 Rscript 在非交互式 bash 模式下返回状态码

问题描述

我正在尝试以 bash 脚本的形式以非交互式方式从运行的 Rscript 中获取状态代码。此步骤是较大数据处理周期的一部分,其中涉及 db2 脚本等。

所以我在脚本sample.sh中有以下内容:

Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout

运行此 sample.sh 时,它始终返回状态代码 0,无论 sample.r 脚本是完全运行还是在中间步骤中出错。

我尝试了以下事情,但没有运气

1 - 在 sample.sh 文件中,我为返回代码添加了 if 和 else 条件,如下所示,但它再次写回 0,尽管 sample.r 在其中的一个函数中失败。

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout
then
  echo -e "0"
else
  echo -e "1"
fi

2 - 我还尝试了一个包装脚本,比如在 sample.wrapper.sh 文件中

r=0
a=$(./sample.sh)
r=$?

echo -e "\n return code of the script is: $a\n"
echo -e  "\n The process completed with status: $r"

在 sample.r 在变量ar. 理想情况下,我想要一种在a.

有人可以建议如何让 rscript 仅在整个脚本完成且没有任何错误的情况下写入“0”,而在所有其他情况下写入“1”?

非常感谢您的意见!谢谢你!

标签: rbashbatch-processingrscriptnon-interactive

解决方案


除了回显之外,我还通过返回状态码解决了这个问题。下面是从 sample.sh 脚本中截取的代码。此外,在 sample.R 代码中,我添加了 trycatch 来捕获错误并退出(状态 = 1)。

function fun {

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r > sample.rout 2>&1
then
  echo -e "0"
  return 0  
else
  echo -e "1"
  return 1
fi

}

fun

感谢大家的投入。


推荐阅读