Como posso usar códigos de saída para executar scripts shell sequencialmente?
-
19-09-2019 - |
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.
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.