Como contornar o loop for do Bash que não sai quando ocorre um erro de subcomando?

Como contornar o loop for do Bash que não sai quando ocorre um erro de subcomando?

Eu tenho um loop for em um script de shell como:

#!/bin/bash
set -u
set -e
for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

A intenção é fazer com que o loop for morra em um incêndio quando qualquer um dos subcomandos falhar de forma semelhante.

Agora, tenho uma solução alternativa: (cd $l; ./run-tests.sh) || die "Message here"junto com uma definição adequada de die. No entanto, estou realmente curioso para saber por que o loop for não termina automaticamente de acordo com a expectativa definida pelo comando "set -e"? Idealmente, eu gostaria de não criar casos especiais em cada loop for assim. :)

Responder1

O motivo set -ede não sair imediatamente se ./run-test.shfalhar é que as linhas:

for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

para uma declaração composta. O status desta instrução composta é o status da última execução de ./run-tests.sh.

Seu trabalho parece bom para mim.

Responder2

Eu não tenho direitos de comentários, então postando aqui. Depende do script em run-tests.sh. Tem certeza de que isso fornece um valor diferente de zero:

./run-tests.sh

eco $?

informação relacionada