Quando você tem um script de shell principal, mas dentro dele, chama outros scripts de shell, por exemplo com os nomes a.sh, b.sh e c.sh
. Você pode ter todas as execuções bem-sucedidas e seus códigos de saída iguais a zero. No entanto, se você olha para o arquivo de saída do primeiro script que é A, e ele contém uma mensagem de erro, na sua sequência lógica, os outros scripts não devem ser executados se a.sh
tiver um erro, portanto como você sai do script principal e para a execução dos outros scripts do shell após identificar o script que possui erro de saída?
O que é um código de saída no script shell bash?
Quando você chama um comando pelo script do shell no Linux Mint, Linux Ubuntu ou outros Unix, o script tem um status de saída. O status de saída é um número inteiro onde o status de saída 0
(zero) significa que o comando foi bem-sucedido sem erros. Um status de saída diferente de zero (1-255) significa que o comando teve uma falha.
Quando um script de shell interrompe com erros
Mesmo que algum comando no seu primeiro script bash resulte em um erro, o script como um todo poderá ser concluído com Código de saída 0
.
Isso significa que seus scripts do sistema operacional em sequência não serão interrompidos, mas você pode verificar o código de saída de qualquer comando individual em seu script, usando a variável $?
.
Essa variável armazena o código de saída do comando anterior. Isso permitirá que você verifique se há erros no script shell.
Esta é uma variável de shell específica chamada $?
para obter o status de saída do comando executado anteriormente. Por exemplo, para imprimir $?
Variável, use o comando echo ou o comando printf:
who
echo $?
wo
echo $?
A saída seria semelhante ao exemplo a seguir:
mazer@mazer$ who
mazer tty7 2022-11-04 13:26 (:0)
mazer@mazer$ echo $?
0
mazer@mazer$ wo
wo: command not found
mazer@mazer$ echo $?
127
Como usar códigos de status de saída em scripts de shell
Como usar o status de saída do comando em uma variável shell? Você pode fazer isso atribuindo $?
a uma variável de shell.
A sintaxe pode ser:
command-to-run
exitStatus=$?
Um exemplo:
## 1. Execute o comando da who ##
cmd="who"
$cmd
## 2. Obtenha o status e armazenar na variável '$status' ##
status=$?
## 3. Teste e tome uma decisão com base em '$status' ##
[ $status -eq 0 ] && echo "$cmd executou com sucesso" || echo "$cmd falhou"
Como determinar e sair de um script de shell com erro qundo interagindo com outros scripts
Agora, voltamos ao nosso problema original que é interromper um script principal se ele tiver erros, chamando uma sequência de scripts.
Para fazer isso, testaremos a variável $?
do shell script que armazena o último erro, logo após alguns comandos que sabemos que um status de erro de saída pode ocorrer.
Um exemplo seria:
#!/bin/bash
#
# Exemplo de script de shell para verificar o status do código de saída
#
## rsync uma pasta local com um servidor remoto ##
rsync --delete -arzhD --stats -e "ssh -p 999 -i ~/.ssh/id_rsa" ./www/ [email protected]:/home/my-remote-user/www/
## Rsyn poderia funcionar sem erros? ##
if [ $? -eq 0 ]
then
echo "Success: Sync finished."
exit 0
else
echo "Failure: An error has occurred please check the server connection" >&2
exit 1
fi
Conclusão
Você pode parar seus scripts de shell bash quando o status de saída tiver erros, evitando que uma sequência de comandos malsucedidos seja chamada, também melhorando seu tempo e produtividade corrigindo esses erros mais cedo com mensagens de saída corretas de seus scripts de shell.
References
https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/
Comentários