É possível manter o último comando exit status ( $?
) inalterado após um teste?
Por exemplo, eu gostaria de fazer:
command -p sudo ...
[ $? -ne 1 ] && exit $?
O último exit $?
deve retornar o status de saída do sudo, mas sempre retorna 0
(o código de saída do teste).
É possível fazer isso sem uma variável temporária?
Outro exemplo para esclarecer mais:
spd-say "$@"
[ $? -ne 127 ] && exit $?
Nesse caso, quero sair apenas se o primeiro comando for encontrado (código de saída! = 127
). E eu quero sair com o spd-say
código de saída real (pode não ser
0
).
EDIT: Eu esqueci de mencionar que eu prefiro uma solução de reclamação POSIX para melhor portabilidade.
Eu uso essa construção em scripts onde eu quero fornecer alternativas para o mesmo comando. Por exemplo, veja meu script crc32 .
O problema com variáveis temporárias é que elas podem sombrear outras variáveis e para evitar que você precise usar nomes longos, o que não é bom para a legibilidade do código.
[ $? -ne 127 ] && exit $?
)
sudo
comando for bem-sucedido (ou seja, se sudo
sair com o status 0). Mas, no seu código, o script continua em execução (não sai) se sudo
for bem
command
e sudo
na verdade não são . É isso o que quero dizer com sair apenas se o primeiro comando for encontrado (código de saída! = 127) e for um retorno especificado paracommand
quando o comando que ele chama não for encontrado. Eu acho que o problema é que invocar sudo
como parte do teste permite sudo
esmagar o retorno command
em primeiro lugar e assim distorcer o teste.
if ! command -p sudo; then exit; fi
que teria os mesmos resultados para o seu exemplo.