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ê:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Isso imprime o código de saída do comando fornecido de maneira semelhante ao time
comando.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Ao redirecionar o printf
para /dev/tty
na função, ainda podemos usar tellexit
redirecionamentos sem obter lixo em nossos fluxos de saída ou erro padrão:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
Ao salvar o código de saída em uma variável, podemos devolvê-lo ao chamador:
$ tellexit false || echo 'failed'
exit code 1
failed
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):
tellexit () {
"$@"
local err="$?"
if [ "$err" -gt 128 ]; then
printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
else
printf 'exit code\t%d\n' "$err" >/dev/tty
fi
return "$err"
}
Teste:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
(A local
coisa requer ash
/ pdksh
/ bash
/ zsh
, ou você pode alterá-la para a typeset
qual algumas outras conchas também entendem.)
sleep 1 && echo $?
iria imprimir o código da célula dormente apenas quando é de zero ...