如果文件输出一些错误,则引发错误(不引发外壳错误)

时间:2020-01-30 13:59:57

标签: shell error-handling

如果可执行文件输出某些特定内容(例如“错误”),我想引发一个错误:

echo "abcdef" | [[ "$(grep "f")" != "" ]] && echo "error"

“错误”

echo "abcdef" | [[ "$(grep "g")" != "" ]] && echo "error"

“”

这项工作,但是将其应用于exe失败

test_if_exe_fails(){
    $1 | [[ "$(grep "$2")" != "" ]] && echo "error: $2" && exit 1
}

运行myApp.exe | test_if_exe_fails "myerror message"时退出

第xxx行:myerror:找不到命令

所以我尝试使用this method,但仍然无法正常工作

假设我的exe输出以“ BLA BLA FOO”开头:

test_if_exe_fails "$(myApp.exe)" "myerror message"

它给出了:

第xxx行:BLA:找不到命令


更多示例:

1 / test_if_exe_fails "$(echo 'hello')" "hola"

第xx行:您好:找不到命令

2 / test_if_exe_fails "$(echo 'hello')" "hello"

第xx行:您好:找不到命令

2 个答案:

答案 0 :(得分:2)

[[ ... ]]的目的是生成if&&||可以测试的退出代码。 grep已经做到了。您不必关心grep的输出,可以使用-q选项取消显示。

echo "abcdef" | grep -q "f" && echo "error"

请注意,您的函数正在包装管道,但是您删除了echo命令。您需要放回去。 (实际上,您应该使用printf而不是echo来实现可移植性和可预测性。最后,错误消息应该写入标准错误,而不是标准输出。

test_if_exe_fails(){
    print '%s' "$1" |  grep -q "$2" && echo "error: $2" >&2 && exit 1
}

test_if_exe_fails "$(myApp.exe)" "myerror message"

最后一项改进:与其捕获myApp.exe的输出,不如直接将其通过管道传递给该函数:

test_if_exe_fails(){
    grep -q "$1" && echo "error: $1" >&2 && exit 1
}

myApp.exe | test_if_exe_fails "myerror message"

答案 1 :(得分:-2)

所以你的功能

test_if_exe_fails(){
$1 | [[ "$(grep "$2")" != "" ]] && echo "error: $2" && exit 1
}

说“运行程序$ 1并grep输出$ 2”

这意味着在调用此函数时,应提供要运行的程序的名称。

但这很愚蠢。在带有echo的示例中,您需要参数,因此不能那样做。有很多种方法可以解决此问题,但是它们都包含了“不再运行程序”功能!