1

我正在尝试以 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”?

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

4

3 回答 3

2

除了回显之外,我还通过返回状态码解决了这个问题。下面是从 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

感谢大家的投入。

于 2019-06-14T19:50:33.837 回答
0

上面的代码对我有用。我对其进行了修改,以便我可以重用该功能并在出现错误时让它退出

Rscript_with_status () {

rscript=$1

if Rscript --vanilla $rscript
then
        return 0
else
        exit 1
fi

}

通过以下方式运行 r 脚本:

Rscript_with_status /path/to/script/sample.r
于 2021-08-15T20:55:15.613 回答
-1

您的远程脚本需要提供正确的退出状态。您可以通过在远程脚本末尾提供即“exit 1”来进行第一次测试,看看它会有所作为。

远程.sh:

#!/bin/sh
exit 1

从本地机器:

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

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

#!/bin/sh
#exit 1
/bin/false

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

于 2019-06-14T05:33:39.020 回答