How to execute multiple command after double pipes in shell script

I am writing a Korn shell script where I have a function like this

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

In words, I put the double pipes followed by a return statement so that the function return immediately when a command fails.

But I also want that it prints some error messages before returning, I tried

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

But it does not work, the first return statement always get executed no matter some_command1 has succeeded or failed.

And

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

also doesn't work, it seems it only return from sub processes not the function and some_command2 get executed no matter some_command1 has succeeded or failed.

Is there a way to group the statements echo "error while doing some_command2"; return 1 such that they both get executed together only when the preceding command fails.

2

1 Answer

The straightforward way is to use { ...; ...; }, this combines the commands without creating a subshell.

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

I do recommend to use stderr for error messages, though:

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

And just because I can, I'll give you my secret shortcut:

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

That last bit is unconventional, but still portable POSIX shell.

4

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like