如何在 shell 脚本中的双管道后执行多个命令

How to execute multiple command after double pipes in shell script

我正在编写一个 Korn shell 脚本,其中我有一个像这样的函数

#!/bin/ksh
myfunc() {
    some_command1 || return 1
    some_command2 || return 1
    ...
}

换言之,我将双管道放在 return 语句之后,以便在命令失败时立即执行 return 函数。

但我还希望它在 returning 之前打印一些错误消息,我试过了

#!/bin/ksh
myfunc() {
    some_command1 || echo "error while doing some_command1"; return 1
    some_command2 || echo "error while doing some_command2"; return 1
    ...
}

但它不起作用,无论 some_command1 成功还是失败,第一个 return 语句总是被执行。

#!/bin/ksh
myfunc() {
    some_command1 || (echo "error while doing some_command1"; return 1)
    some_command2 || (echo "error while doing some_command2"; return 1)
    ...
}

也不起作用,似乎只有 return 来自子进程而不是函数,无论 some_command1 成功还是失败,some_command2 都会执行。

有没有办法对语句 echo "error while doing some_command2"; return 1 进行分组,以便只有在前面的命令失败时它们才会一起执行。

最直接的方法是使用 { ...; ...; },这会合并命令而不创建子shell。

some_command1 ||
    { echo "error while doing some_command1"; return 1; }

不过,我建议使用 stderr 来显示错误消息:

some_command1 ||
    { echo "error while doing some_command1" >& 2; return 1; }

因为我可以,所以我会给你我的秘密捷径:

some_command1 ||
    return 1 $(echo "error while doing some_command1" >& 2)

最后一点是非常规的,但仍然便携 POSIX shell。