Pergunta

Uma vez que o controle de cruzeiro é cheio de bugs que desperdiçaram toda a minha semana, eu decidi os shell scripts existentes que tenho são mais simples e, portanto, melhor.

Aqui está o que eu tenho até agora

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'

A única coisa é o outro dia eu mudei os caminhos e se esqueceu de atualizar a chamada rsync. Como resultado, o "me avisar" passo correu várias vezes enquanto eu estava imaginando coisas fora.

Eu sei que no linux você pode fazer command1 && command2 e se o comando 1 "falhar" command2 não será executado, mas como posso observar o "fracasso / sucesso" códigos de saída para fins de depuração. Alguns dos scripts que eu mesmo escrevi e tenho certeza que vou precisar de fazer algo especial.

Foi útil?

Solução

O código de saída de um processo anterior passa a ser na variável $? logo após a sua execução. Normalmente (que não é exigido, mas é a convenção todo mundo segue) o código de saída de um comando bem-sucedida será igual a 0, e quaisquer outros meios de valor um erro.

Lembre-se das advertências! Um deles é que, após estes comandos:

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

o resultado de zero provavelmente ser devolvido, porque no $? o código de retorno de awk está contido. Para evitar isso, defina a algum lugar opção pipefail acima do código:

set -o pipefail 1

Outras dicas

A melhor opção, especialmente para scripts autônoma, é para definir a opção shell -e:

#!/bin/sh -e

ou

set -e

Isto fará com que o shell para parar a execução se qualquer (não testado) saídas de comando com um código de erro diferente de zero.

          -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.

O valor de retorno do comando de última corrida é armazenado na variável $?. Você pode usar isso para determinar qual comando para executar seguinte. Visão de variáveis ??especiais.

i pensar $? contém o último código de saída

if [[ -z $? ]]
then
  # notify me
  ssh example.com 'php /path/tasks/build.php'
fi

Eu sugiro que você pode usar o diferente de zero saída nos pontos onde se espera que a falha e antes de processar passo adiante você vai verificar if [$? -neq 0] então há uma falha.


A $? sempre retornará um número diferente de zero se o último processo não executado com êxito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top