为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

2023-11-29

无法找出合适的标题,我不明白 dash/bash 中的行为。也就是说,我使用 set -e 在命令失败时进行救援,并使用命令组来处理积极结果。

IE。总体方案是:

[ ! wantcommand ] || command

Than 意味着该命令仅在需要时执行,失败将自动终止脚本。

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

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

这导致了一些奇怪的错误搜寻,因为不会杀死外壳我无法理解背后的原因。我现在必须查看一些 shell 代码,但想了解原因。

供测试用:

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

or:

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

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


set -e只能保释未经检查的失败。

当你在失败时分支(使用if, until, while, && or ||),检查该故障。

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


引用自规格,并强调:

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

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

  2. 执行后面的化合物列表时,应忽略 -e 设置while, until, if, or elif保留字,以!保留字,或AND-OR 列表中除最后一个命令之外的任何命令.

  3. 如果除子 shell 命令之外的复合命令的退出状态是失败的结果-e被忽略,然后-e不适用于该命令。

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

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

the false命令导致子 shell 退出而不执行echo one;然而,echo two因为管道的退出状态而被执行(false; echo one) | cat为零。

请注意,此规范随着时间的推移而发生变化;实现 POSIX 规范先前修订版的 shell 可能不完全符合此处引用的版本。


在这里发表一些意见——我强烈建议阅读Bash常见问题解答 #105并确保您在决定使用之前完全理解其中描述的所有行为set -e而不是手动实现显式错误处理。这FVUE 维基进一步描述了之间的行为区别set -e在 bash-native 模式和 POSIX 模式下,这同样应该被理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 set -e 不会导致 `false || 失败假&&真`? [复制] 的相关文章

  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 从命令行更改 konsole 选项卡标题并使其持久?

    如何更改 konsole 选项卡标题 默认情况下 它设置为 u n 所以它总是自动改变 我可以这样设置 qdbus org kde konsole KONSOLE DBUS SESSION setTitle 1 My Title 但是一旦您
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Grep 搜索带有换行符的字符串

    如何使用 grep 输出下面给出的输入文件中出现的字符串 export to excel 具体来说 如何处理搜索字符串之间发生的换行符 grep 中是否有一个开关可以执行此操作或其他命令 输入文件 文件a txt 等等 导出到优秀 巴拉巴拉
  • 如何在 Bash 中删除字符串的第一部分?

    该代码将给出第一部分 但是如何删除它并获取没有第一部分的整个字符串 echo first second third etc cut d f1 你应该看看info cut 这将解释什么f1 means 实际上我们只需要第二个字段之后的字段 f
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • HBase Shell 日志记录

    使用 HBase shell 时 我收到大量日志记录 包括 INFO 和 DEBUG 消息 虽然这对于学习 HBase 内部结构来说很有趣 但它非常冗长并且可能会掩盖输出 我尝试过以多种不同的方式更改日志记录级别 包括所描述的here ht
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • Ruby 在特定目录中运行 shell 命令

    我知道如何在 Ruby 中运行 shell 命令 例如 x cmd 但是 如何指定运行此命令的目录 有没有类似的脱壳方式 类似subprocess Popen在Python中 subprocess Popen r c mytool tool
  • Xcode 方案预操作脚本未运行

    点击构建 构建日志中不会打印任何内容 是什么赋予了 Xcode 版本 8 2 1 8C1002 预操作发生在构建之前 因此输出不会进入构建日志 而是进入 stdErr 您可以将输出复制到文件中 exec gt PROJECT DIR pre
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • rsync --include 选项不排除其他文件

    尝试rsync某些扩展名 sh 的文件 但下面的bash脚本仍然传输所有文件 为什么 from home xxx rsync zvr include sh from root host home tmp 您需要添加 exclude all
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置

随机推荐

  • 读取文本文件并显示在表 vbscript 中

    我有一个具有以下结构的文本文件 C Users abc Desktop New Folder sample txt AccountName gt AbcPos AccountName gt dblLayer queryAccount gt
  • 在更新插入时跳过空值

    我正在使用 pg promise 来处理我的 Postgres 查询 但在找到以下查询的解决方案时遇到了麻烦 我正在尝试创建一种方法来一次批量插入多行 这是我的代码 massUpsert orgId entities gt db tx t
  • 如何在不重新启动的情况下关闭DEP(数据执行保护)?

    我正在编写一个测试网页 它调用 DLL 文件中的函数 但是每次我使用IE或FF打开它之前我必须禁用DEP 数据执行保护 否则脚本无法执行 当前禁用 DEP 的方法需要重新启动 但我不想重新启动 基本上 我正在寻找一种无需重新启动即可关闭 D
  • Google Cardboard Unity 5 没有立体视觉

    我的 Cardboard 应用程序在设备上没有立体效果 但它在编辑器中有效 这就是它在编辑器中的样子 https i stack imgur com sN14x png 这是它在设备上的样子https i stack imgur com 7
  • Pod 在 Kubernetes 中启动但不工作

    创建了具有 3 个 Pod 的 Kubernetes 集群部署 并且全部运行良好 但是当尝试运行它们时无法做到这一点 尝试在描述部分中执行卷曲 Pod 的 Ip 内部 我可以看到此错误 MountVolume SetUp failed fo
  • 自动执行eclipse插件

    我尝试创建一个 Eclipse 插件 当 Eclipse 工作台关闭时 它会删除一些文件 我从Hello World command插件项目并添加了IWorkbenchListener就像本主题中提到的Eclipse 关闭钩子能够停止终止
  • django 对 MongoDB 的内置支持

    我正在尝试查找官方 django 是否支持任何 noSQL DBMS 尤其是 MongoDB 的信息 我找到了一个Django 1 3 的分支 the Django nonrel 官方 django 的一个分支 和其他一些不太可靠的项目 根
  • 填充xaml矩形倍数solidcolorbrush

    xaml中这种类型的填充矩形可以吗 我不想使用渐变来填充矩形 因为每个部分的图像使用不同的纯色画笔 Thanks 尝试这个
  • std::string 构造函数中的内存分配/堆损坏

    我在内存分配方面再次遇到了一些麻烦 但我不明白为什么 当我在调试模式下运行程序时 我收到以下错误消息 我尝试尽可能准确地翻译它 Windows 已触发 LogoColorDetector exe 中的断点 这可能是由堆损坏引起的 这表明 L
  • 代理验证失败错误

    我正在尝试通过 FTP 站点代理访问 FTP 服务器以绕过防火墙it sauronsoftware ftp4j FTPClient我知道我的用户名 密码是正确的 因为我可以使用 FileZilla 进行连接 我尝试使用Authenticat
  • 如何编写多线程函数来同时处理不同的任务?

    我想定义一个do in parallelpython 中的函数将接受带参数的函数 为每个函数创建一个线程并并行执行它们 该函数应该像这样工作 do in parallel sleep 3 sleep 8 sleep 3 然而我很难定义do
  • WPF 数字 UpDown 控件在哪里?

    进入第一个严肃的 WPF 项目 似乎有很多基本的控件都缺失了 具体来说 我正在寻找 Numeric UpDown 控件 我是否错过了乐队外的发行 真的不想写自己的控件 我不想使用 WindowsFormHost 并在其上放置 WinForm
  • “mvn clean install”与“mvn install”有何不同?

    有什么区别mvn clean install and mvn install clean是 Maven 中自己的构建生命周期阶段 可以将其视为操作或任务 mvn clean install告诉 Maven 做clean运行之前每个模块中的阶
  • 如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期

    我已经看了很多 但到目前为止仍然无法得到答案 非常感谢任何帮助 我有一个简单的String to Date字段映射并尝试将 JSON 字符串读取到 Java 对象 JsonInclude value Include NON EMPTY Js
  • 谷歌电子表格“查询”功能可以在谷歌应用程序脚本中使用吗?

    我正在寻找一种以编程方式填充电子表格的方法 该电子表格根据登录用户过滤另一个电子表格中的数据 我可以使用电子表格中的查询功能来完成此操作 但是 无法找到从应用程序脚本调用查询函数的方法 这可以做到吗 将不胜感激示例代码 谢谢 不知道有没有限
  • 返回之前的 JPanel

    我继承了代码 并且由于需要长时间解释的原因 我需要使用空布局 我一直在尝试利用他们在 JPanels 之间导航的内容 我一直不知道怎么做 这就是我现在所拥有的 它被编译成下面的 SSCCE 我试图做的是将 JPanel 添加到 ArrayL
  • 多类分类中负例的经验法则

    在多类分类任务中 对于表示 其他所有内容 的标签 样本数量应该有多大 是否有一个经验法则 示例 我想将我的输入分类为以下之一X类 这X 1当输入为 以上都不是 时 类将激活 假设我的数据集包含 10 个 正 类别中每个类别的 5 000 个
  • 将 KML 文件读入 R

    我正在构建一个工作流程 用于将多几何 KML 文件读取到 R 中 这是我的工作地图 具有点和路径几何形状 可重现的 R 脚本是 library rgdal setwd SPECIFY A FOLDER download file http
  • 在Python中删除字符

    有人知道如何删除特定字符后面的所有字符吗 像这样 http google com translate t into http google com 如果您询问的是抽象字符串而不是网址 您可以使用 gt gt gt astring http
  • 为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

    这个问题在这里已经有答案了 无法找出合适的标题 我不明白 dash bash 中的行为 也就是说 我使用 set e 在命令失败时进行救援 并使用命令组来处理积极结果 IE 总体方案是 wantcommand command Than 意味