我试图以非交互方式以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”吗?
非常感谢您的投入!谢谢!
答案 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
感谢大家的投入。