管道中失败的命令未触发 "catch" 命令
failed command in pipeline not triggering "catch" command
我正在尝试设置一小段代码,这样如果其中任何一段失败,它将触发另一行代码 运行。所以喜欢:
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" 语句(如果您想这样称呼它)根本不存在。此外,它的第一部分特别是在管道之前,是如果失败则不会抛出错误的部分。我对管道的第二部分没有任何问题,所以我不确定它是否会表现出相同的行为。
提前致谢!
( cmd1 | cmd2 ; exit ${PIPESTATUS[0]}) || cmd3
如果您对 运行 子 shell 中的那些命令没有问题,即 ()
.
,这应该对您有用
您可以使用进程替换使 zenity
的退出状态变得无关紧要。
if pkexec apt -y install (package-file-name) > >(
zenity --progress --pulsate --auto-close --no-cancel --text="installing (package-name) . . ."
); then
notify-send "(package-name) has been installed"
else
zenity --error --text="Error code: $?"
fi
或者,您可以使用显式命名管道来避免需要任何非标准 shell 扩展。
mkfifo p
zenity --progress --pulsate --auto-close --no-cancel --text="installing (package-name) . . ." < p &
if pkexec apt -y install package-file-name > p; then
notify-send "(package-name) has been installed"
else
zenity --error --text="Error code: $?"
fi
在bash中可以设置pipefail
。例如:
$ cat a.sh
#!/bin/bash
false | true || echo executed 1
set -o pipefail
false | true || echo executed 2
$ ./a.sh
executed 2
我正在尝试设置一小段代码,这样如果其中任何一段失败,它将触发另一行代码 运行。所以喜欢:
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" 语句(如果您想这样称呼它)根本不存在。此外,它的第一部分特别是在管道之前,是如果失败则不会抛出错误的部分。我对管道的第二部分没有任何问题,所以我不确定它是否会表现出相同的行为。
提前致谢!
( cmd1 | cmd2 ; exit ${PIPESTATUS[0]}) || cmd3
如果您对 运行 子 shell 中的那些命令没有问题,即 ()
.
您可以使用进程替换使 zenity
的退出状态变得无关紧要。
if pkexec apt -y install (package-file-name) > >(
zenity --progress --pulsate --auto-close --no-cancel --text="installing (package-name) . . ."
); then
notify-send "(package-name) has been installed"
else
zenity --error --text="Error code: $?"
fi
或者,您可以使用显式命名管道来避免需要任何非标准 shell 扩展。
mkfifo p
zenity --progress --pulsate --auto-close --no-cancel --text="installing (package-name) . . ." < p &
if pkexec apt -y install package-file-name > p; then
notify-send "(package-name) has been installed"
else
zenity --error --text="Error code: $?"
fi
在bash中可以设置pipefail
。例如:
$ cat a.sh
#!/bin/bash
false | true || echo executed 1
set -o pipefail
false | true || echo executed 2
$ ./a.sh
executed 2