我有这个脚本。
#!/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
的退出状态,而不是vmpull
或vmsync
这就是为什么即使内部脚本错误,循环也不会中断。
如何捕捉vmpull
或vmsync
的错误并仍然进行管道处理?
感谢。
答案 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
是可选的,以防止不必要的分叉,你可以删除它。