忽略 bash 中非常具体的错误消息

Kar*_*son 2 bash

script.sh:

#!/bin/bash
my-bin-file-i-run

if [ $? -eq 0 ]
then
    exit 0
else
    if [[ >&2 == *"name_to_handle_at"* ]]; then
        exit 0
    fi
    echo >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

我想运行我的命令,如果它抛出一个错误,其中消息包含“name_to_handle_at”,它将像脚本没有错误一样处理它,所有其他错误都应该像往常一样显示。无法真正让它发挥作用。

Kus*_*nda 6

您的语法有问题,因为您不能仅将某些先前执行的命令的标准错误与==此类进行比较。

一个建议是将错误流保存到一个文件中,然后解析它:

#!/bin/bash

if ! my-bin-file-i-run 2>error.log; then
    if ! grep -q -F 'name_to_handle_at' error.log; then
       echo 'some error message' >&2
       exit 1
    fi
fi
Run Code Online (Sandbox Code Playgroud)

这将运行命令并将标准错误流重定向到名为error.log. 如果命令因错误而终止,grep则用于name_to_handle_at在日志文件中查找字符串。如果找不到,则会打印一条错误消息,并且脚本以非零退出状态终止。

在任何其他情况下,脚本以零退出状态终止。

如果您希望在error.log脚本终止时删除该文件,您可以rm error.log在适当的位置或使用EXIT陷阱明确地这样做:

#!/bin/bash

trap 'rm -f error.log' EXIT

if ! my-bin-file-i-run 2>error.log; then
    if ! grep -q -F 'name_to_handle_at' error.log; then
       echo 'some error message' >&2
       exit 1
    fi
fi
Run Code Online (Sandbox Code Playgroud)

  • @KarlMorrison 通过命令替换绝对可以捕获程序的输出,但是由于我们不知道此输出是否可能包含数兆字节的数据,或者仅包含几行文本,因此将数据发送到可能更安全一个临时文件。代码也变得有点丑陋(恕我直言)。 (2认同)