如何在非交互式bash模式下获取Rscript以返回状态代码

时间:2019-06-13 22:45:43

标签: r bash batch-processing rscript non-interactive

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

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

r

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

我尝试了以下方法,但是没有运气

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

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

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

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

在sample.r失败的情况下,在变量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" a的中间步骤中,我也都没有得到预期的'1'。理想情况下,我想要一种方法来捕获r中的错误(为'1')。

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

非常感谢您的投入!谢谢!

2 个答案:

答案 0 :(得分:0)

您的远程脚本需要提供适当的退出状态。 您可以通过在远程脚本的末尾提供“ exit 1”来进行第1次测试,然后看会有所不同。

remote.sh:

1 -> 2 -> 3 -> 4 -> null
100 -> 4 -> null

在本地计算机上:

#!/bin/sh
exit 1

但是远程脚本还应该向您提供最后执行的命令的退出状态。通过修改远程脚本进一步进行实验:

ssh -l username remoteip /home/username/remote.sh
echo $?
1

远程命令的退出状态现在也将为1。

答案 1 :(得分:0)

我通过返回echo之外的状态代码解决了这个问题。以下是从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

感谢大家的投入。