Подтвердить что ты не робот

Shell scripting: умереть при любой ошибке

Предположим, что оболочка script (/bin/sh или /bin/ bash) содержит несколько команд. Как я могу сделать make script завершающим, если какая-либо из команд имеет статус выхода из строя? Очевидно, можно использовать, если блоки и/или обратные вызовы, но есть ли более чистый, более сжатый способ? Использование && тоже не является вариантом, потому что команды могут быть длинными, или script может иметь нетривиальные вещи, такие как циклы и условные обозначения.

4b9b3361

Ответ 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!"