我正在编写一个脚本,该脚本将在不同的服务器上自动执行命令,并且试图记录所有内容和输出。我在重定向和命令状态输出方面遇到困难。意思是命令成功了,它的输出是什么?
我尝试了很多方法,例如将命令输出重定向到函数或文件。我尝试了一个简单的if语句。两者都为受人尊敬的功能而努力。但是,当我尝试将两者结合在一起时,脚本始终会返回成功的命令。在某种程度上是这样。
#!/bin/bash
function Executing(){
if [ "$1" != "" ]; then
if [ $DEBUG = "true" ]; then
echo "$1" | Debug i s
if $1 2>&1 | Debug o o;then
echo "$1" | Debug s r
else
echo "$1" | Debug e r
fi
else
eval $1
fi
fi
}
Executing "apt-get update"
还请注意,系统需要sudo来执行apt-get更新。因此,脚本应报告并记录错误。现在,每当我调用Executing函数时,该函数都会返回成功的执行。我很确定是因为添加了管道| debug o o
来捕获输出并设置其格式。稍后我将其重定向到日志文件。
因此,我测试了if apt-get update;then echo yes;else echo no; fi
可以在我的终端上正常工作。但是,只要将输出通过管道传递给debug函数,if语句就会返回true。
答案 0 :(得分:0)
尝试使用set -o pipefail
。
查看手册:The Set Builtin
通常,bash返回管道组的最后一个命令的退出代码,因此您的Debug
命令已被检查。使用该设置,bash返回最后一个(最右边)命令的退出状态,以非零状态退出。如果您的命令失败,那就是传播的状态。