Comment faire pour contourner Bash for loop ne pas quitter lorsqu'une erreur de sous-commande?

3

J'ai une boucle for dans un script shell à la:

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

L'intention est d'avoir la boucle for-die dans un feu lorsque l'une des sous-commandes génère une erreur similaire.

Maintenant, j'ai un moyen de contourner le problème: (cd $l; ./run-tests.sh) || die "Message here" avec une définition appropriée de die. Cependant, je suis vraiment curieux de savoir pourquoi la boucle for ne se termine pas automatiquement selon l'attente définie par la commande "set -e"? Idéalement, j'aimerais ne pas avoir de cas particulier pour chaque boucle comme celle-là. :)

Samuel A. Falvo II
la source

Réponses:

1

La raison set -e ne quitte pas immédiatement si ./run-test.sh échoue est que les lignes:

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

pour une déclaration composée. Le statut de cette instruction composée est le statut de la dernière exécution de ./run-tests.sh.

Votre travail me semble bien.

R Sahu
la source
Merci! Je ne pensais pas à cela comme une simple déclaration composée, mais cela a du sens.
Samuel A. Falvo II
0

Je n'ai pas le droit de commenter, donc je poste ici. Cela dépend du script dans run-tests.sh. Êtes-vous sûr que cela donne une valeur différente de zéro:

./run-tests.sh

echo $?

beginer
la source
Positif. Instruction de sortie 1 codée à la main à des fins de test.
Samuel A. Falvo II