From: Jeff King Date: Sun, 29 Mar 2015 17:43:13 GMT Subject: Re: [question] && chaining vs shell loops Message-ID: <20150329174312.GA6680@peff.net> In-Reply-To: <874mp3948k.fsf@igel.home> On Sun, Mar 29, 2015 at 06:07:39PM +0200, Andreas Schwab wrote: > Max Kirillov 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