Предположим, что оболочка script (/bin/sh или /bin/ bash) содержит несколько команд. Как я могу сделать make script завершающим, если какая-либо из команд имеет статус выхода из строя? Очевидно, можно использовать, если блоки и/или обратные вызовы, но есть ли более чистый, более сжатый способ? Использование && тоже не является вариантом, потому что команды могут быть длинными, или script может иметь нетривиальные вещи, такие как циклы и условные обозначения.
Shell scripting: умереть при любой ошибке
Ответ 1
Со стандартными sh
и bash
вы можете
set -e
Он будет
$ help set
...
-e Exit immediately if a command exits with a non-zero status.
Он также работает (из того, что я мог собрать) с zsh
. Он также должен работать для любого потомка оболочки Bourne.
С csh
/tcsh
вам нужно запустить script с помощью #!/bin/csh -e
Ответ 2
Возможно, вы могли бы использовать:
$ <any_command> || exit 1
Ответ 3
Вы можете проверить $? для просмотра самого последнего кода выхода.
например
#!/bin/sh
# A Tidier approach
check_errs()
{
# Function. Parameter 1 is the return code
# Para. 2 is text to display on failure.
if [ "${1}" -ne "0" ]; then
echo "ERROR # ${1} : ${2}"
# as a bonus, make our script exit with the right error code.
exit ${1}
fi
}
### main script starts here ###
grep "^${1}:" /etc/passwd > /dev/null 2>&1
check_errs $? "User ${1} not found in /etc/passwd"
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1`
check_errs $? "Cut returned an error"
echo "USERNAME: $USERNAME"
check_errs $? "echo returned an error - very strange!"