threads / discuss / 38940

[question] && chaining vs shell loops

Subject: [question] && chaining vs shell loops

## tl;dr

4 messages between Mar 29, 2015 and Mar 30, 2015.

replies: 3people: 3as markdown or json

Max Kirillov· Mar 29, 2015, 15:48 UTC · lore
Hi.

As far as I can see, loops in shell ignore non-zero exit codes of the bodies which are not last. For example, exit code of command 'for f in false true; do $f; done' is 0, even if there was false.

How should one workaround it in test scripts, is there any established approach?

-- 
Max
Andreas Schwab· Mar 29, 2015, 16:07 UTC · re: Max Kirillov · lore

Re: [question] && chaining vs shell loops

Max Kirillov <max@max630.net> writes:
> As far as I can see, loops in shell ignore non-zero exit
> codes of the bodies which are not last. For example, exit
> code of command 'for f in false true; do $f; done' is 0,
> even if there was false.

There is nothing special with loops, that's how the exit code of compound commands is defined in general: it's the exit code of the last executed command.

Andreas.
-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Jeff King· Mar 29, 2015, 17:43 UTC · re: Andreas Schwab · lore

Re: [question] && chaining vs shell loops

On Sun, Mar 29, 2015 at 06:07:39PM +0200, Andreas Schwab wrote:
Show 10 quoted lines
> Max Kirillov <max@max630.net> writes:
> 
> > As far as I can see, loops in shell ignore non-zero exit
> > codes of the bodies which are not last. For example, exit
> > code of command 'for f in false true; do $f; done' is 0,
> > even if there was false.
> 
> There is nothing special with loops, that's how the exit code of
> compound commands is defined in general: it's the exit code of the last
> executed command.

Yes, but that makes it problematic if you want to know if any of the loop iterations failed. Doing:

  for f in false true; do $f || break; done
doesn't work, because the "break" has exit code 0. Doing:
  (for f in false true; do $f || exit 1; done)

works. In our test scripts, it is also OK to just "return 1", because the test snippets execute inside a function.

If you have other solutions, I'd love to hear them. I just fixed several of these loops recently, and I couldn't come up with anything more clever.

-Peff
Max Kirillov· Mar 30, 2015, 06:29 UTC · re: Jeff King · lore

Re: [question] && chaining vs shell loops

On Sun, Mar 29, 2015 at 8:43 PM, Jeff King <peff@peff.net> wrote:
> In our test scripts, it is also OK to just "return 1", because
> the test snippets execute inside a function.
Thanks, sounds like a plan.
-- 
Max

← back to recent threads