如果可执行文件输出某些特定内容(例如“错误”),我想引发一个错误:
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行:您好:找不到命令
答案 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的示例中,您需要参数,因此不能那样做。有很多种方法可以解决此问题,但是它们都包含了“不再运行程序”功能!