usando
time sleep 1
rendimentos:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
existe um comando que eu possa usar para imprimir o código de saída sleep
ou qualquer comando que eu queira executar?
Algo gosta:
$ log-exit-code sleep 1
talvez isso seja suficiente?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
fonte
fonte
sleep 1 && echo $?
iria imprimir o código da célula dormente apenas quando é de zero ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Respostas:
Nos meus testes até agora, isso funcionou:
command && echo "$?" || echo "$?"
Apenas diz a ele para ecoar o código de saída, se for bem-sucedido ou se falhar.
Como Sato apontou abaixo, é essencialmente o mesmo que:
command; echo "$?"
Uma coisa que pode fazer com que o comando e / ou valha a pena é algo como:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Se você precisa que seu script atue no código de saída, como a preocupação de Olivier, isso não é problema. Seu script pode ser algo como:
fonte
command; echo $?
?command; echo $?
é uma resposta muito melhor.command ; echo $?
porqueecho $?
sempre é bem-sucedido e, portanto, depois dele, o novo valor de $? agora é 0. Existe uma maneira de manter o código de retorno original mesmo depois de exibi-lo, caso esse código de retorno original seja útil mais tarde (por exemplo: em um script, a verificação do código de retorno é importante antes de decidir como continuar). Veja a minha resposta para uma das várias soluções (a maioria das respostas aqui podem ser alteradas da mesma forma)cmd && echo "$?"
não funcionaria, uma vez que, necessariamente, imprimiria zeros (echo
somente seria executado com a conclusão bem-sucedida do comando anterior).Aqui está uma função de shell curta para você:
Isso imprime o código de saída do comando fornecido de maneira semelhante ao
time
comando.Ao redirecionar o
printf
para/dev/tty
na função, ainda podemos usartellexit
redirecionamentos sem obter lixo em nossos fluxos de saída ou erro padrão:Ao salvar o código de saída em uma variável, podemos devolvê-lo ao chamador:
Uma versão mais sofisticada da mesma função também imprime o sinal que interrompeu o comando se o código de saída for maior que 128 (o que significa que ele terminou devido a um sinal):
Teste:
(A
local
coisa requerash
/pdksh
/bash
/zsh
, ou você pode alterá-la para atypeset
qual algumas outras conchas também entendem.)fonte
Use uma função de invólucro de shell. Provavelmente com um nome diferente.
(Obviamente, isso corromperá a saída padrão; portanto, use o
tty
mostrado por @Kusalananda ou não fora de contextos interativos.)Ao sair para um território não transportável, algumas shells podem relatar o status de todos os comandos em um pipeline, não apenas o último, por exemplo, no ZSH, se você deseja que as falhas sejam relatadas em um pipeline inteiro:
TRAPZERR
caso contrário, não será acionado quando não houver erro (no principal "nenhuma notícia é boa notícia").fonte
O GNU
time
tem uma opção para isso:Passa pelo código de saída 1 , a menos que seja morto por um sinal 2 :
Se você deseja conhecer / lidar com a situação de interrupção do sinal, passe
-v
e grep o stderr para a stringCommand terminated by signal
.1 Obrigado a Olivier Dulac por observar o código de saída.
2 Além disso, obrigado Stéphane Chazelas por apontar o código de saída do sinal de morte não passa.
fonte
0
embora se o comando for morto.256+signum
ou384+signum
ou mesmosignum/256
ousignum/256+0.5
se um núcleo foi gerado (na verdade, o status retornado porwaitpid()
dividido por 256). Alguns dariam uma representação textual (comosigint
ousigquit+core
). Ainda vale a pena discutir no grupo de notícias gnu.coreutils.bugs, eu concordo.time
não faz parte dacoreutils
, é um pacote por conta própria com a sua lista de discussão própria bug ([email protected]))system()
dos awks tradicionais como o ainda mantido por Brian Kernighan (ok
inawk
) ou onawk
do Solaris, oawk
do FreeBSD que deriva disso.awk 'BEGIN{print system("kill -s ABRT $$")}'
saídas0.523438
quando o tamanho do dump principal não é limitado. O comportamento degawk
mudou recentemente, com diferentes comportamento com--traditional
ou--posix
(ver também o valor de retorno declose(cmd)
uma maior variação)Não gosto de todas as outras respostas (embora eu goste muito da inteligência): elas exibem o código de saída, mas também o ALTERAM. (a parte exibida é verdadeira, portanto, depois disso, o código de retorno é 0)
Aqui está uma versão modificada:
fonte
time
nem sempre disponível.Para ser um pouco mais robusto, envie o status de saída para um FD separado, para que ele possa ser tratado independentemente do stdout / stderr:
Observe que você precisará fazer algo com o FD3 ou ele dirá
Bad file descriptor
.Isso pode ser configurado ainda mais para fornecer essas saídas às entradas de outro programa, fazendo com que o outro programa escute em mais de um FD; você pode usar isso como uma espécie de Kibana dos anos 90 :)
fonte
Embora todas as outras respostas (muito interessantes) abordem a pergunta exata que o OP fez, na prática, as coisas geralmente são mais simples. Você acabou de salvar o status de saída em uma variável (imediatamente após o comando) e relatá-lo ou registrá-lo da maneira que desejar. Por exemplo, imprima em / dev / stderr ou escreva / anexe-o como uma mensagem de texto em um arquivo de log. E também é preservado para uso na tomada de decisão / controle de fluxo no código subseqüente.
Se estiver em uma função:
Se estiver diretamente em um script:
(Abaixando e cobrindo porque isso não responde à pergunta exata .)
fonte