如何在管道之前测试命令,捕获它的输出并了解命令 运行 是否成功

How can I test a command before a pipe, capture it's output and understand if the command ran successfully or not

我正在编写一个脚本,它将在不同的服务器上自动执行命令,我正在尝试记录它的所有内容和输出。我在重定向和命令状态输出方面遇到困难。意思是命令成功了,它的输出是什么?

我尝试了很多方向,例如将命令输出重定向到函数或文件。我试过一个简单的 if 语句。两人都为那里的受人尊敬的职能工作。但是当我试图将它们结合起来时,脚本总是 return 命令成功。在某种程度上它是。

#!/bin/bash

function Executing(){
  if [ "" != "" ]; then
    if [ $DEBUG = "true" ]; then
      echo "" | Debug i s
      if  2>&1 | Debug o o;then
        echo "" | Debug s r
      else
        echo "" | Debug e r
      fi
    else
      eval 
    fi
  fi
}

Executing "apt-get update"

另请注意,系统需要 sudo 才能执行 apt-get update。因此脚本应该报告并记录错误。现在,每当我调用 Executing 函数时,函数 return 都会成功执行。我很确定它确实如此,因为添加的管道 | debug o o 捕获输出并对其进行格式化。我稍后会重定向到日志文件。

所以我测试了 if apt-get update;then echo yes;else echo no; fi 它在我的终端上工作。但是一旦我将输出通过管道传递给调试函数,if 语句 returns true.

试试 set -o pipefail

查看手册:The Set Builtin

通常,bash returns 管道组的最后一个命令的退出代码,因此您的 Debug 命令是被检查的命令。使用该设置,bash returns 最后一个(最右边的)命令以非零状态退出的退出状态。如果您的命令失败,这就是传播的状态。