¿Cómo solucionar el bucle for de Bash que no sale cuando se produce un error en un subcomando?

¿Cómo solucionar el bucle for de Bash que no sale cuando se produce un error en un subcomando?

Tengo un bucle for en un script de shell a la:

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

La intención es que el bucle for muera en un incendio cuando cualquiera de los subcomandos produzca un error similar.

Ahora tengo una solución alternativa: (cd $l; ./run-tests.sh) || die "Message here"junto con una definición adecuada de die. Sin embargo, tengo verdadera curiosidad por saber por qué el bucle for no termina automáticamente según la expectativa establecida por el comando "set -e". Lo ideal sería no incluir casos especiales en cada bucle for como ese. :)

Respuesta1

La razón por la set -eque no sale inmediatamente si ./run-test.shfalla es que las líneas:

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

para una declaración compuesta. El estado de esta declaración compuesta es el estado de la última ejecución de ./run-tests.sh.

Tu solución me parece buena.

Respuesta2

No tengo derechos para comentar, así que publico aquí. Depende del script en run-tests.sh. ¿Estás seguro de que esto da un valor distinto de cero?

./ejecutar-pruebas.sh

eco $?

información relacionada