【问题标题】:Grep R error message in bash to halt a pipelinebash 中的 Grep R 错误消息以停止管道
【发布时间】:2022-10-15 16:05:39
【问题描述】:

我有一个我正在研究的管道。我有一个 wrappper.sh 将各种 .R 脚本连接在一起。但是,此管道将运行一条错误消息。我想添加一种方法来 grep 我们的单词 Error if True,关闭管道。我知道我需要一个 if/else 语句,但不知道如何从 bash.sh 中运行的 .R 脚本中提取此信息。查看示例错误。

当前脚本:

#!/bin/bash

#Bash script for running GeoMx Pipeline

####
# Install required R packages for pipeline
echo "installing R packages"

Rscript installPackages.R

echo "DONE! R packages installed"

#####
# Created required folders
echo "Creating Folders"

Rscript CreateFolder.R

echo "DONE! Folders created"

####
# Copy data over
cp -u -p Path/Initial\ Dataset.xlsx /PATO_TO

####
# Run Statistical Models

echo "Running Statistical Analysis"

Rscript GLM_EdgeR.R

echo "DONE! Statistical Models completed"

错误示例:

Error in glmLRT(glmfit, coef = coef, contrast = contrast) :
  contrast vector of wrong length, should be equal to number of coefficients in the linear model.
Calls: glmQLFTest -> glmLRT
Execution halted

我想要的是:

#!/bin/bash

#Bash script for running GeoMx Pipeline

####
# Install required R packages for pipeline
echo "installing R packages"

Rscript installPackages.R

if grep error == TRUE
then 
   echo "Fatal Error, STOP Pipeline"
   STOP
else 
   echo "DONE! R packages installed"

#####
# Created required folders
echo "Creating Folders"

Rscript CreateFolder.R

if grep error == TRUE
then 
   echo "Fatal Error, STOP Pipeline"
   STOP
else 
   echo "DONE! Folders created"

####
# Copy data over
cp -u -p Path/Initial\ Dataset.xlsx /PATO_TO

####
# Run Statistical Models

echo "Running Statistical Analysis"

Rscript GLM_EdgeR.R

if grep error == TRUE
then 
   echo "Fatal Error, STOP Pipeline"
   STOP
else 
   echo "DONE! Statistical Models completed"

【问题讨论】:

  • 如果你真的需要要解析错误消息,您必须捕获它。为此,您必须告诉我们 R 程序打印到标准输出的内容以及打印到标准错误的内容。但是,如果您的 R 脚本表现得足够好,那么测试其退出代码就足够了。

标签: r bash


【解决方案1】:

您不需要 grep 查找错误,您可以测试最后一个状态码是否非零:

#!/bin/bash

Rscript CreateFolder.R

exit_code=$?
if test $exit_code -ne 0
then
  echo "Fatal Error, STOP Pipeline"
  exit $exit_code
else
  echo "DONE! Folders created"
fi

如果Rscript CreateFolder.R 失败,bash 脚本将以相同的状态码退出。

尽管如果您有更多要检查的条件,则改用set -e 是有意义的。

如果管道可能包含一个 单个简单命令、列表或 复合命令返回非零状态。
https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

基本上它使您的脚本运行直到出现故障:

#!/bin/bash
set -e
Rscript installPackages.R
echo "DONE! R packages installed"
Rscript CreateFolder.R
echo "DONE! Folders created"
Rscript GLM_EdgeR.R
echo "DONE! Statistical Models completed"

使用第二个脚本 CreateFolder.R 失败,它将如下所示:

~/r# ./wrappper.sh
[1] "OK"
DONE! R packages installed
Error: object 'will_fail' not found
Execution halted

【讨论】:

  • 如果您不想区分不同的非零退出代码,为什么要将退出代码存储到变量中?在您的解决方案中,if ! Rscript CreateFolder.R 会更简单。
  • 更简单 - 是的。在该示例中,wrapper.sh 调用者将收到非零退出代码,因此它可以进行清理。即使在这种特殊情况下,上下文(实际失败的调用和错误)也会丢失。
  • @margusl,谢谢你的例子!两者都很完美。 set -e 解决方案是一个不错的功能,我以前从未遇到过!
猜你喜欢
  • 2012-08-16
  • 2022-09-23
  • 2023-03-27
  • 2012-07-12
  • 2016-05-13
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多