cmd && echo "$?"
no funcionaría ya que, por necesidad, solo imprimiría ceros ( echo
solo se ejecutaría al completar con éxito el comando anterior).
Aquí hay una breve función de shell para ti:
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
Esto imprime el código de salida del comando dado de manera similar a como lo hace el time
comando.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
Al redirigir a printf
to /dev/tty
en la función, aún podemos usar tellexit
redirecciones sin obtener basura en nuestra salida estándar o secuencias de error:
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
Al guardar el código de salida en una variable, podemos devolverlo a la persona que llama:
$ tellexit false || echo 'failed'
exit code 1
failed
Una versión más elegante de la misma función también imprime la señal que eliminó el comando si el código de salida es mayor que 128 (lo que significa que terminó debido a una señal):
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"
}
Pruebas:
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
(La local
cosa requiere ash
/ pdksh
/ bash
/ zsh
, o puede cambiarlo a lo typeset
que algunos otros shells también entienden).
sleep 1 && echo $?
imprimiría el código de la celda durmiente solo cuando sea cero ...