如何在 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。
我正在编写一个 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。