Bash 如何在set-e上下文中运行flakey命令?

Bash 如何在set-e上下文中运行flakey命令?,bash,error-handling,Bash,Error Handling,我想用set-e来保护我的大部分bash脚本,以便在脚本处理过程中检测到错误时尽早失败。但是,我仍然希望能够运行一些实际预期会失败的命令,例如使用grep来评估用于指导脚本其余部分的控制流的某些文件内容是否存在。如何在set-e上下文中运行grep,从而允许grep失败,并记录B grep的exist状态以供脚本的其余部分访问 在普通POSIX sh中,我会执行以下操作: grep 'needle' haystack >/dev/null if [ "$?" -eq 0 ]; then

我想用set-e来保护我的大部分bash脚本,以便在脚本处理过程中检测到错误时尽早失败。但是,我仍然希望能够运行一些实际预期会失败的命令,例如使用grep来评估用于指导脚本其余部分的控制流的某些文件内容是否存在。如何在set-e上下文中运行grep,从而允许grep失败,并记录B grep的exist状态以供脚本的其余部分访问

在普通POSIX sh中,我会执行以下操作:

grep 'needle' haystack >/dev/null
if [ "$?" -eq 0 ]; then
    handle_grep_results
else
    handle_grep_no_results
fi

但是,当在本节之前指定set-e时,只要grep找不到指针,脚本就会提前退出。解决这一问题的一种方法是使用set+e暂时禁用保护,然后在本节结束后重新启用它们,但如果有意义的话,我更愿意保持保护打开。bash是否可以这样做?

您只需检查grep的返回状态:

Shell实用程序使用返回状态与Shell通信;他们所传达的信息不一定是错误情况。正如grep示例所示,它可以是一个简单的布尔值。事实上,[[builtin及其friends]和测试正是这样做的:使用状态代码返回布尔结果。这并不会使这些实用程序变得不稳定

set-e忽略在条件中或在| |或&&连接器左侧执行的命令的非零状态返回,这使得可以使用set-e

话虽如此,-e是一个非常直截了当的工具,一般不建议在生产代码中使用它。使用| |总是会显式失败:


您只需检查grep的返回状态:

Shell实用程序使用返回状态与Shell通信;它们所通信的不一定是错误条件。正如grep示例所示,它可以是一个简单的布尔值。事实上,[[builtin及其朋友[测试就是这样做的:使用状态代码返回一个布尔结果。这并不会使这些实用程序变得脆弱

set-e忽略在条件中或在| |或&&连接器左侧执行的命令的非零状态返回,这使得可以使用set-e

话虽如此,-e是一个非常直截了当的工具,一般不建议在生产代码中使用它。使用| |总是会显式失败:

您的if命令似乎包含两个输入错误(前面有一个额外的空格和一个缺少的空格),但更一般地说,您应该理解if的目的是运行命令并检查其退出代码

command
if [ $? = 0 ]; then
写得更简洁、更地道

if command; then
在此上下文中,命令的失败退出状态并不是导致set-e终止脚本的条件,因为这样就不能在脚本中使用set-e

在此特定示例中,then和else块都包含简单命令,您可以简化为简写

grep -q 'needle' haystack && handle_grep_results || handle_grep_no_results
这也表明

command || true
当您根本不关心set-e脚本中的命令是否成功时

请注意grep-q over grep>/dev/null-前者意味着-m1,即grep可以关闭文件并在找到第一个匹配项时返回success。

您的if命令似乎包含两个输入错误,一个额外的空格和一个缺少的空格],但更一般地说,您应该理解if的目的是运行命令并检查其退出代码

command
if [ $? = 0 ]; then
写得更简洁、更地道

if command; then
在此上下文中,命令的失败退出状态并不是导致set-e终止脚本的条件,因为这样就不能在脚本中使用set-e

在此特定示例中,then和else块都包含简单命令,您可以简化为简写

grep -q 'needle' haystack && handle_grep_results || handle_grep_no_results
这也表明

command || true
当您根本不关心set-e脚本中的命令是否成功时


还请注意grep-q over grep>/dev/null-前者意味着-m1,即grep可以关闭文件并在找到第一个匹配项时返回success。

我认为-e是一种调试辅助工具,可以帮助您在开发代码时捕捉不需要的情况,而不是在任务关键型代码中进行整体设置。从这个意义上讲,我在类似的断言方式。我认为-e是一种调试辅助工具,可以帮助您在开发代码时捕捉不需要的情况,而不是在关键任务代码中进行整体设置。从这个意义上说,我以类似的方式使用它来断言。感谢输入错误,我定义了那些kebaabs。感谢输入错误,我定义了输入错误凯巴布斯酒店