Сценарии оболочки: умереть при любой ошибке - PullRequest
34 голосов
/ 15 декабря 2008

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

Ответы [ 3 ]

59 голосов
/ 15 декабря 2008

Со стандартными sh и bash вы можете

set -e

Это будет

$ help set
...
        -e  Exit immediately if a command exits with a non-zero status.

Это также работает (из того, что я мог собрать) с zsh. Это также должно работать для любого потомка оболочки Bourne.

С csh / tcsh вы должны запустить свой скрипт с #!/bin/csh -e

17 голосов
/ 03 августа 2009

Может быть, вы могли бы использовать:

$ <any_command> || exit 1
0 голосов
/ 08 февраля 2012

Вы можете проверить $? чтобы увидеть, какой самый последний код выхода ..

* 1003 например *

#!/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!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...