On Fri, Jul 23, 2021 at 1:34 PM Elijah Newren <newren@xxxxxxxxx> wrote: > On Wed, Jul 21, 2021 at 2:07 PM Derrick Stolee via GitGitGadget > <gitgitgadget@xxxxxxxxx> wrote: > > + for side in left right > > + do > > + git checkout -b merge-$side base && > > + echo $side >>deep/deeper2/a && > > + echo $side >>folder1/a && > > + echo $side >>folder2/a && > > + git add . && > > + git commit -m "$side" || return 1 > > Why is this "|| return 1" here? > > It looks like there are a number of other cases of this in the file > too, which I must have overlooked previously, because I don't > understand any of them. A shell for-loop won't automatically terminate just because some command in its body fails. Instead it will run to completion and return the status of the last command of the last iteration, which may not be the iteration which failed, thus a failure can be hidden. Therefore, we need to proactively stop the loop iteration _and_ ensure that the return status of the loop itself reflects the failure, which we do by `|| return 1`. (If this loop was inside a subshell, we'd use `|| exit 1` instead.)