Я хотел бы остановить свой BASH, если в командах есть какие-либо ошибки.
make clean || ( echo "ERROR!!" && echo "ERROR!!" >> log_file && exit 1 )
Но, похоже, мой BASH все еще продолжается. Как поставить exit 1
в однострочные операторы
Я очень новичок в BASH, любая помощь приветствуется!
exit 1
выходит из подоболочки, созданной ()
, а не из исходной оболочки. Используйте {}
, чтобы сохранить группу команд в той же оболочке.
Не используйте &&
между командами, если вы не хотите остановиться, как только одна из них выйдет из строя. Используйте ;
для разделения команд в одной строке.
make clean || { echo "ERROR!!" ; echo "ERROR!!" >> log_file ; exit 1 ;}
Или просто используйте if
, чтобы было легче понять.
if ! make clean
then
echo "ERROR!!"
echo "ERROR!!" >> log_file
exit
fi
У вас есть прямое решение в ответ Бармара. Альтернативой, если вы хотите проверить несколько команд аналогичным образом, может быть определение функции, которую можно использовать повторно:
die() {
echo "ERROR: $@"
echo "ERROR: $@" >> log_file
exit 1
}
make clean || die "I left it unclean"
make something || die "something went wrong"
или, если вы хотите, чтобы скрипт завершал работу при первых признаках проблемы, вы можете использовать set -e
set -e
make clean # stops here unless successful
make something # or here if this line fails etc.
Вы также можете зарегистрировать сообщение об ошибке, чтобы установить trap
на ERR
. errfunc
здесь будет вызываться перед выходом из скрипта, а номер строки, в которой произошел сбой, будет записан в журнал:
errfunc() {
echo "ERROR on line $1"
echo "ERROR on line $1" >> log_file
}
trap 'errfunc $LINENO' ERR
set -e
make clean
make something
Я бы использовал
;
(или разрывы строк, как в версииif
) вместо&&
междуecho
s иexit
- с&&
, если какая-либо командаecho
не работает по какой-то странной причине, она не запуститexit
... и если все настолько запутано, чтоecho
не может работать, вы В самом деле хотите выйти из скрипта.