Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Slightly OT: Error-Handling in a Pipeline, preferably non-zsh



On Sunday, August 15, 2004, at 11:03 PM, Philippe Troin wrote:

Aaron Davies <agdavi01@xxxxxxxxxxxxxx> writes:

How do I do return-value error handling in the middle of a pipeline?
I'd ideally like to keep this to as basic a shell level as possible,
plain (Bourne) sh-compatible if it can be done, though a bash or zsh
solution will be fine if not. I'm tring to write a simple script that
will apply a command to all processes matching a name--sort of a
generalized "killall". At the moment, it looks like this:

#!/bin/sh

name=$1
shift

ps aux | grep $name | grep -v grep | grep -v $0 | awk '{ print $2 }' |
xargs $@

and it works fine, and I'd like to keep it at that level of
simplicity. The only thing is, I'd like to make it stop and return 1
if there are no matching processes. (At the moment, it calls the
command with an empty argument list.) The intuitive thing to do seems
to be

ps aux | grep $name | grep -v grep | ( grep -v $0 || exit 1 ) | awk '{
print $2 }' | xargs $@

Use your first idiom and check $pipestatus[4].

Thanks, that seems to solve it (though it's [3], not [4]). I've combined that with xargs's "-r" option, which aborts if there are no arguments passed, to produce the following as the final script:

#!/bin/sh

name=$1
shift

ps aux | grep $name | grep -v grep | grep -v $0 | awk '{ print $2 }' | xargs -r "$@"
test ${PIPESTATUS[3]} -eq 0 && exit || exit 1
--
    __                      __
   /  )                    /  )
  /--/ __. .__  ______    /  / __. , __o  _  _
 /  (_(_/|_/ (_(_) / (_  (__/_(_/|_\/ <__</_/_)_



Messages sorted by: Reverse Date, Date, Thread, Author