Как я могу использовать коды выхода для последовательного запуска сценариев оболочки? - PullRequest
1 голос
/ 13 ноября 2009

Поскольку круиз-контроль полон ошибок, которые потратили впустую всю мою неделю, я решил, что имеющиеся у меня сценарии оболочки проще и, следовательно, лучше.

Вот что у меня есть

svn update /var/www/k12/
#svn log --revision "HEAD" /var/www/code/  | head -2 | tail -1 | awk '{print $1}' > /var/www/path/version.txt

# upload the files
rsync -ar --verbose --stats --progress --delete --exclude=*.svn /var/www/code/ example.com:/home/path

# bring database up to date
ssh example.com 'php /path/tasks/dbrefactor.php'

# notify me
ssh example.com 'php /path/tasks/build.php'

Единственное, на днях я изменил пути и забыл обновить вызов rsync. В результате шаг «уведомить меня» выполнялся несколько раз, пока я разбирался с вещами.

Я знаю, что в Linux вы можете сделать command1 && command2, и если команда 1 "не удалась", команда2 не запустится, но как мне наблюдать коды выхода "сбой / успех" в целях отладки. Некоторые из сценариев я написал сам, и я уверен, что мне нужно будет сделать что-то особенное.

Ответы [ 5 ]

4 голосов
/ 13 ноября 2009

Наилучшим вариантом, особенно для сценариев, оставленных без присмотра, является установка параметра оболочки -e:

#!/bin/sh -e

или

set -e

Это приведет к прекращению выполнения оболочки, если какая-либо (непроверенная) команда завершится с ненулевым кодом ошибки.

          -e      Exit  immediately if a simple command (see SHELL GRAMMAR
                  above) exits with a non-zero status.  The shell does not
                  exit  if  the  command that fails is part of an until or
                  while loop, part of an if statement, part of a && or  ||
                  list, or if the command's return value is being inverted
                  via !.  A trap on ERR, if set, is  executed  before  the
                  shell exits.
2 голосов
/ 13 ноября 2009

Код завершения предыдущего процесса находится в переменной $? сразу после его выполнения. Обычно (это не обязательно, но это соглашение, которому все следуют) код завершения успешной команды будет равен 0, а любое другое значение означает ошибку.

Помните о предостережениях! Одним из них является то, что после этих команд:

svn log --revision "HEAD" /var/www/code/  | head -2 | tail -1 | awk '{print $1}'
echo "$?"

Нулевой результат, скорее всего, будет возвращен, поскольку в $? содержится код возврата awk Чтобы избежать этого, установите параметр pipefail где-нибудь над кодом:

set -o pipefail 1
1 голос
/ 13 ноября 2009

я думаю, что $? содержит последний код выхода

if [[ -z $? ]]
then
  # notify me
  ssh example.com 'php /path/tasks/build.php'
fi
1 голос
/ 13 ноября 2009

Возвращаемое значение команды последнего запуска сохраняется в переменной $?. Вы можете использовать это, чтобы определить, какую команду запустить дальше. Обзор специальных переменных.

0 голосов
/ 13 ноября 2009

Я бы посоветовал вам использовать выход не ноль в точках, где ожидается сбой, и перед дальнейшим шагом обработки вы проверите если [$? -neq 0] затем происходит сбой.


$? всегда будет возвращать ненулевое число, если последний процесс не был выполнен успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...