当前位置: 首页 > 面试题库 >

为什么不设置-e导致`false ||失败 假&&真实?

闻鹤龄
2023-03-14
问题内容

无法找出合适的标题,我不理解破折号/重击的行为。也就是说,如果命令失败,我将使用set -e来纾困,并使用命令组来处理肯定的结果。

即。总体方案是:

[ ! wantcommand ] || command

比意味着仅在需要时才执行命令,并且失败将自动终止脚本。

可能需要一些后处理,在这种情况下,我使用以下方法:

[ ! wantcommand ] || { command && postprocess; }

这导致了一些奇怪的bug搜寻,因为这 不会杀死shell, 而我也无法理解原因。我现在必须遍历一些shell代码,但想了解原因。

用于检测:

bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"'

要么:

bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"'

注意:我不是在要求修复,而是主要 为什么返回码为1,但shell不会退出


问题答案:

set -e仅对 未检查的 故障保驾护航。

当您在故障分支(使用ifuntilwhile&&||),即故障检查。

如果规范不是以这种方式编写的,则短路布尔运算将无法有效地用于流控制,因为错误的分支总是会导致退出。

引用规范,并强调:

启用此选项后,如果任何命令失败(由于Shell错误的后果中列出的任何原因或通过返回大于零的退出状态),则Shell应立即退出,就像通过执行exit特殊内置实用程序一样不带参数,但以下情况除外:

  1. 多命令管道中任何单个命令的失败都不会导致外壳退出。仅考虑管道本身的故障。

  2. 该-e设置应执行以下化合物列表时被忽略whileuntilif,或elif保留字,管道期初!保留字,或
    比上其他的与一或列表的任何命令

  3. 如果除subshel​​l命令以外的复合命令的退出状态-e是被忽略时失败的结果,则-e不适用于该命令。

此要求分别适用于外壳环境和每个子外壳环境。例如,在:

set -e; (false; echo one) | cat; echo two

false命令使子shell退出而不执行echo one; 但是,echo two由于管道的退出状态(false; echo one) | cat为零,因此执行。

请注意,此规范已随时间而改变;实现POSIX规范的先前版本的shell可能与此处引用的版本不完全一致。

在这里提出一些意见-
我强烈建议您阅读BashFAQ#105,并确保您在决定使用之前完全理解其中描述的所有行为,set -e而不是手动实施显式的错误处理。所述FVUE维基进一步描述之间的行为的区别set -e在bash本地模式和POSIX模式,它同样应理解的。



 类似资料:
  • 问题内容: 我正在使用Django作为我的主力构建应用程序。到目前为止,一切都很好-指定了数据库设置,配置的静态目录,URL,视图等。但是,当我想呈现自己漂亮的自定义404.html和500.html页面时,麻烦开始悄悄出现。 我阅读了有关自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到了我的应用程序的模板目录(也在set

  • 对于scanner对象,方法返回true,而方法返回false,这是怎么回事? 注意:基于输入文件,方法按预期返回结果;似乎没有返回正确的结果。 下面是我正在运行的代码,它创建了以下结果: 以下是我要传递给此扫描仪的文件的实际内容: 以下是我运行代码时在控制台中打印的内容的结尾,包括我无法理解的部分:

  • 问题内容: 有一次,我改变DEBUG = False,我的网站将产生500(使用WSGI和manage.py runserver命令),并且在Apache的错误日志中没有错误信息,当我改变它通常会运行debug到True。 我正在使用Django 1.5和Python 2.7.3,这是Apache访问日志,并且在apache错误日志中没有任何日志 这是我的设置文件: 问题答案: Django 1.

  • 我读了很多关于这个错误的帖子,大多数都是关于管理图像的。 但当我停止应用程序(放在后台)时,我得到了这个错误,所以应该是关于内存中的数据... 我没有在我的片段和activity的onStop()中做任何事情。 我已经检查了onSaveInstanceState(final Bundle outState)并且该Bundle为空...“? 我有5个ArrayList对象,在进行测试时,我意识到如果

  • 我正在尝试创建一个UDP服务器,它可以向所有向其发送消息的客户端发送消息。实际情况稍微复杂一点,但将其想象为聊天服务器是最简单的:以前发送过消息的每个人都会收到其他客户端发送的所有消息。 所有这些都是通过在单独的进程中完成的。(不过,所有网络连接都在同一个系统中,所以我认为UDP的不可靠性在这里不是问题。 服务器代码是这样一个循环(后面是完整的代码): 客户端代码也很简单——同样,这是稍微缩写的,