linux - 管道中失败的命令未触发 "catch"命令

标签 linux bash pipe conditional-execution

我正在尝试设置一小段代码,这样如果其中任何一段失败,它将触发另一行代码运行。就像这样:

cmd1 || cmd2

但是,第一段中有一个管道,所以:

cmd1 | cmd2 || cmd3

但是,如果 cmd1 失败,则 cmd3 不会运行。

如果尝试过以下,每次都得到相同的结果:

( cmd1 | cmd2 ) || cmd3
{ cmd1 | cmd2 } || { cmd3 }

为了完整起见,这是我正在使用的特定代码块:

{
        {
            pkexec apt -y install (package-file-name) | zenity --progress --pulsate --auto-close --no-cancel --text="installing (package-name) . . ." 

        } && {
            notify-send "(package-name) has been installed"
        }
} || {
        zenity --error --text="Error code: $?"
}

到目前为止,它的运行就好像“catch”语句(如果您想这样调用它)根本不存在一样。此外,它的第一部分特别是在管道之前,是如果失败则不会抛出错误的部分。我对管道的第二部分没有任何问题,所以我不确定它是否会表现出相同的行为。

提前致谢!

最佳答案

在bash中,你可以设置pipefail。例如:

$ cat a.sh
#!/bin/bash

false | true || echo executed 1
set -o pipefail
false | true || echo executed 2
$ ./a.sh
executed 2

关于linux - 管道中失败的命令未触发 "catch"命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57403860/

相关文章:

windows - 关于管道的基本问题

c - 如何检查c [duplicate]中是否存在文件

php - 如何从 PHP 脚本暂停/重启 Linux Ubuntu?

bash - 提取子字符串直到第一个数字

json - 在 bash 中将 json 解析为数组

c - 当您从 execvp 接收输出时,从管道中读取适量的数据

linux - 将 linux 控制台中的所有键入命令及其结果复制到文件中

linux - signal() 有什么作用?

bash - 如何在 Unix shell 脚本中查找 `YYYY-MM-DD` 格式的日期与今天日期之间的日差?

regex - 如何使用Notepad++正则表达式管道超过一个字符的字符串?