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à. :)

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.


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 $?


Positif. Instruction de sortie 1 codée à la main à des fins de test.
Samuel A. Falvo II
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.