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:

[email protected]$ who
mazer    tty7         2022-11-04 13:26 (:0)
[email protected]$ echo $?
0
[email protected]$ wo
wo: command not found
[email protected]$ 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/