Как обойти проблему с выходом из цикла Bash при возникновении ошибки подкоманды?

Как обойти проблему с выходом из цикла Bash при возникновении ошибки подкоманды?

У меня есть цикл for в скрипте оболочки, например:

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

Цель состоит в том, чтобы цикл for прекратил работу, если в любой из подкоманд возникнет аналогичная ошибка.

Теперь у меня есть обходной путь: (cd $l; ./run-tests.sh) || die "Message here"вместе с подходящим определением die. Однако мне искренне интересно, почему цикл for не завершается сам по себе в соответствии с ожиданием, установленным командой "set -e"? В идеале я бы не хотел делать каждый цикл for таким особым случаем. :)

решение1

Причина, по которой set -eне происходит немедленного выхода в случае ./run-test.shсбоя, заключается в том, что строки:

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

для составного оператора. Статус этого составного оператора — это статус последнего запуска ./run-tests.sh.

Мне кажется, что ваша работа хороша.

решение2

У меня нет прав на комментарий, поэтому пишу здесь. Это зависит от скрипта в run-tests.sh. Вы уверены, что это дает ненулевое значение:

./run-tests.sh

эхо $?

Связанный контент