shell:无法将错误流代码保存到文件

nhhxz33t  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(227)

我试图通过在第二个脚本(catch_error.sh)的while循环中运行以下脚本(random_fail.sh)来检测它何时失败(这种情况很少发生):
第一个
我希望catch_error. sh将从/tmp/error中读取,并在random_fail.sh的特定运行以1退出时退出循环。
相反,catch脚本似乎一直在运行。我认为这是因为错误代码根本没有被重定向到/tmp/error文件。
请帮帮忙。

sg3maiej

sg3maiej1#

您没有以正确/通常的方式捕获错误代码。另外,当执行命令已经包含shebang时,不需要在执行命令前加上“bash”前缀。最后,奇怪的是为什么您不简单地使用**#!/bin/bash而不是#!/usr/bin/env bash**。
第二个脚本应修改为如下所示:

#!/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"
hgc7kmma

hgc7kmma2#

如果random_fail.sh向stderr输出一个单独的数字1,则[ "$error" != 1 ]true。只要不发生这种情况,脚本就会循环。您可以测试是否向stderr写入了任何内容。有几种方法可以实现这一点:

printf '' >/tmp/error
while [[ ! -s /tmp/error ]]

error=
while (( $#error == 0 ))

error=
while [[ -z $error ]]
pod7payv

pod7payv3#

/tmp/error将始终为空或包含“The error was using magic numbers”这一行。它永远不会包含0或1。如果您想知道脚本的退出值,只需直接检查即可:

if ./random_fail.sh 1>/tmp/msg 2>/tmp/error; then error=1; else error=0; fi

或者,可以这样做:

./random_fail.sh 1>/tmp/msg 2>/tmp/error
error=$?

但这两件事都不要做。只要做:

while ./random_fail.sh; do ...; done

只要random_fail.sh(请阅读https://www.talisman.org/~erlkonig/documents/commandname-extensions-considered-harmful/并停止使用.sh后缀命名脚本)返回0,循环体将进入。当它返回非零值时,循环终止。

相关问题