Eu tenho isso em um script bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Parece que ele sairá logo após o comando exit, o que faz sentido. Eu queria saber se existe algum comando simples que pode fornecer um código de saída sem sair imediatamente?
Eu ia adivinhar:
exec exit 3
mas dá uma mensagem de erro: exec: exit: not found
. O que eu posso fazer? :)
bash
shell-script
exec
exit
exit-status
G-Man diz que 'restabelece Monica'
fonte
fonte
exec exit 3
não é bom, eu recebo #"exec: exit: not found"
exit_code=3
e eliminar aexit 3
linha completamente?$?
variável, mas não sair desse script"?Respostas:
Se você possui um script que executa algum programa e analisa o status de saída do programa (com
$?
), e deseja testá-lo fazendo algo que faz$?
com que seja definido com algum valor conhecido (por exemplo,3
), basta fazerOs parênteses criam uma subcasca. Em seguida, o
exit
comando faz com que o sub-shell saia com o status de saída especificado.fonte
exit_code="3"
para testarexit
é um bash embutido, então você não podeexec
. De acordo com o manual do bash :Juntando tudo isso, eu diria que sua única opção é armazenar o status de saída desejado em uma variável e,
exit $MY_EXIT_STATUS
quando apropriado.fonte
$?
(embora eu não tenha muita certeza do porquê), isso parece uma resposta sólida. Se você deseja apenas defini-lo com algum valor malsucedido,false
é outra opção.Você pode escrever uma função que retorne o status fornecido como argumento, ou
255
se nenhum for fornecido. (Eu o chamo deret
"retorna" seu valor).e use
ret
no lugar da sua chamada paraexit
. Isso evita a ineficiência de criar a subcasca na resposta atualmente aceita.Algumas medições.
na minha máquina leva cerca de 3,5 segundos.
na minha máquina leva cerca de 0,051 segundos, 70 vezes mais rápido. A colocação no manuseio padrão ainda o deixa 60 vezes mais rápido. Obviamente, o loop tem alguma sobrecarga. Se eu mudar o corpo do loop para apenas ser
:
outrue
o tempo for reduzido para metade para 0,025, um loop completamente vazio será uma sintaxe inválida. A adição;:
ao loop mostra que esse comando mínimo leva 0,007 segundos, portanto a sobrecarga do loop é de cerca de 0,018. Subtrair essa sobrecarga dos dois testes mostra que aret
solução é 100 vezes mais rápida.Obviamente, essa é uma medida sintética, mas as coisas se somam. Se você torna tudo 100 vezes mais lento do que o necessário, acaba com sistemas lentos. 0,0
fonte
Sobre
exec exit 3
... ele tentaria executar um comando externo chamadoexit
, mas não há um, então você recebe o erro. Ele deve ser um comando externo, em vez de um incorporado ao shell, pois oexec
substitui completamente. O que também significa que, mesmo se você tivesse um comando externo chamadoexit
,exec exit 3
não retornaria para continuar seu script de shell, pois o shell não estaria mais lá .fonte
exec bash -c "exit 3"
, mas no momento não consigo pensar em nenhum motivo para fazer isso, em vez de apenasexit 3
.exec
'ing ou apenasexit
' ing vai parar o script, o que não parece ser o que a pergunta queria.Você pode fazer isso com o Awk:
Ou Sed:
fonte
sh -c 'exit 9'
(exit 9)
na resposta aceita