#!/usr/bin/env bash
# catch_error.sh
count=0 # The number of times before failing
error=0 # assuming everything initially ran fine
while [ "$error" != 1 ]; do
# running till non-zero exit
# writing the error code from the radom_fail script into /tmp/error
./random_fail.sh 1>/tmp/msg 2>/tmp/error
error=$?
echo "$error"
# updating the count
count=$((count + 1))
done
echo "random_fail.sh failed!: $(cat /tmp/msg)"
echo "Error code: ${error}"
echo "Ran ${count} times, before failing"
3条答案
按热度按时间sg3maiej1#
您没有以正确/通常的方式捕获错误代码。另外,当执行命令已经包含shebang时,不需要在执行命令前加上“bash”前缀。最后,奇怪的是为什么您不简单地使用**#!/bin/bash而不是#!/usr/bin/env bash**。
第二个脚本应修改为如下所示:
hgc7kmma2#
如果
random_fail.sh
向stderr输出一个单独的数字1
,则[ "$error" != 1 ]
为 true。只要不发生这种情况,脚本就会循环。您可以测试是否向stderr写入了任何内容。有几种方法可以实现这一点:或
或
pod7payv3#
/tmp/error
将始终为空或包含“The error was using magic numbers”这一行。它永远不会包含0或1。如果您想知道脚本的退出值,只需直接检查即可:或者,可以这样做:
但这两件事都不要做。只要做:
只要
random_fail.sh
(请阅读https://www.talisman.org/~erlkonig/documents/commandname-extensions-considered-harmful/并停止使用.sh
后缀命名脚本)返回0,循环体将进入。当它返回非零值时,循环终止。