从管道的左操作数捕获错误

时间:2014-07-14 03:21:25

标签: bash

我有这个脚本。

#!/bin/bash

ERROR=0

while ((ERROR == 0)); do
  /home/super/bin/vmpull 2>&1 | tee /home/super/logs/vmpull.log
  ERROR=$?
  /home/super/bin/vmsync 2>&1 | tee /home/super/logs/vmsync.log
  ERROR=$?
  sleep 1d

done

我需要按顺序运行两个内部命令,直到其中任何一个返回错误。 但在这里,我抓住了tee的退出状态,而不是vmpullvmsync 这就是为什么即使内部脚本错误,循环也不会中断。

如何捕捉vmpullvmsync的错误并仍然进行管道处理?

感谢。

1 个答案:

答案 0 :(得分:2)

建议使用William Pursell,您可以使用PIPESTATUS

  /home/super/bin/vmpull 2>&1 | tee /home/super/logs/vmpull.log
  ERROR=${PIPESTATUS[0]}

您可以选择ERROR=$PIPESTATUS,因为您正在访问第一个元素。

在您的情况下,另一种方法是使用流程替代隐藏tee命令:

  /home/super/bin/vmpull > >(exec tee /home/super/logs/vmpull.log) 2>&1
  ERROR=$?

exec是可选的,以防止不必要的分叉,你可以删除它。