
У меня есть цикл 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
эхо $?