Escrevi um watchdog C++ que executa um conjunto de scripts para determinar se há um problema nesse sistema.
O código é um pouco complicado, então não vou mostrá-lo aqui, mas é equivalente a uma chamada de sistema da seguinte forma:
int const r(system("/bin/sh /path/to/script/test-health"));
Somente r
é 0 quando o script falha porque um comando está ausente em uma if
instrução. Há a parte ofensiva do roteiro:
set -e
[...]
if unknown_command arg1 arg2
then
[...]
O unknown_command
obviamente falha desde... é desconhecido. Nesse ponto, o script termina porque eu tenho o set -e
no início.
O código de saída, no entanto, será 0 nessa situação.
Haveria uma maneira de obter um código de saída de 1 em tal situação?
ou seja a questão é detectar o erro sem precisar adicionar um teste para saber se unknown_command
existe. Eu sei como fazer isso:
if ! test -x unknown_command
then
exit 1
fi
O que quero dizer é que, quando escrevo esse script, espero unknown_command
que exista enquanto eu mesmo o instalo, mas se algo der errado ou alguém copiar o script em outro sistema sem instalar tudo, gostaria de saber que recebi um erro ao executar o roteiro.
Do padrão POSIX, em relação a
set -e
:Isso significa que a execução de um comando desconhecido em uma
if
instrução não fará com que o script seja encerrado ao ser executado emset -e
. Ou melhor,set -e
não fará com que ele termine.Usuário
command -v
para testar se existe um utilitário no atualPATH
, a menos que você use caminhos completos para os utilitários que invoca, caso em que um-x
teste seria suficiente, como na sua pergunta.Veja também: Por que não usar "which"? O que usar então?
Isso é uma falsidade.
Escrita comum:
Você diz que sabe como testar um comando desconhecido.
Concha Almquist como
/bin/sh
:Concha Korn como
/bin/sh
:Bourne Again shell como
/bin/sh
:Concha Z como
/bin/sh
:Uma vez que sua pergunta pergunta como evitar algo que não acontece em primeiro lugar, e toma uma falsidade tanto como premissa quanto como título, é irrespondível.
O
if
não sai porque oset -e
foi configurado:Prints (em todos os shells testados, com variações da mensagem de erro):
Ambos com
set -e
set ou unset.Se você deseja detectar comandos ausentes, capture um código de saída de 127 1 :
Que será executado assim:
1
Sobre o código de saída 127
Você deve fazer uma de duas coisas:
1:
Em seguida, o
set -e
fará com que o script seja encerrado seunknown_command
falhar. Por que você está dizendoif
?2: