要将stdout和stderr重定向(并附加)到文件中,同时还在终端上显示它,我这样做:
command 2>&1 | tee -a file.txt
Run Code Online (Sandbox Code Playgroud)
但是,有没有其他方法可以做到这一点,以便我获得退出状态的准确值?
也就是说,如果我测试$?,我想看到退出状态command,而不是退出状态tee.
我知道我可以${PIPESTATUS[0]}在这里使用而不是$?,但我正在寻找另一种不需要检查的解决方案PIPESTATUS.
我想转向以下内容:
git status --short && (git status --short | xargs -Istr test -z str)
这得到了我想要的结果,即将输出镜像到stdout并对结果进行零长度检查,使其更接近:
git status --short | tee >(xargs -Istr test -z str)
不幸的是,它返回了tee的退出代码(总是为零).
有没有办法优雅地获得替代过程的退出代码?
[编辑]
我现在要使用以下内容,它会阻止运行相同的命令两次,但似乎要求更好的东西:
OUT=$(git status --short) && echo "${OUT}" && test -z "${OUT}"
我真正想做的就是确保管道中的所有内容都成功并将最后一个标准输入分配给变量。考虑以下简化的场景:
x=`exit 1|cat`
当我跑步时declare -a,我看到这个:
declare -a PIPESTATUS='([0]="0")'
我需要某种方法来注意到exit 1,所以我将其转换为:
exit 1|cat|xargs -I {} x={}
并declare -a给了我:
declare -a PIPESTATUS='([0]="1" [1]="0" [2]="0")'
这就是我想要的,所以我尝试看看如果exit 1没有发生会发生什么:
echo 1|cat|xargs -I {} x={}
但它失败了:
xargs: x={}: No such file or directory
有没有办法让 xargs 分配{}给x?PIPESTATUS其他工作并将标准输入分配给变量的方法怎么样?
注意:这些例子是简化的。我并没有真正执行exit 1或echo 1a cat,而是使用这些命令进行简化,以便我们可以专注于我的特定问题。