utilizando
time sleep 1
rendimientos:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
¿Hay algún comando que pueda usar para imprimir el código de salida sleep
o el comando que quiera ejecutar?
Algo le gusta:
$ log-exit-code sleep 1
tal vez esto suficiente?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
fuente
fuente
sleep 1 && echo $?
imprimiría el código de la celda durmiente solo cuando sea cero ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Respuestas:
En mis pruebas hasta ahora esto ha funcionado:
command && echo "$?" || echo "$?"
Simplemente le dice que haga eco del código de salida si tiene éxito o si falla.
Como señaló Sato a continuación, esto es esencialmente lo mismo que:
command; echo "$?"
Una cosa que podría hacer que valga la pena el comando y / o el comando es algo como:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Si necesita que su script actúe sobre el código de salida, como le preocupa a Olivier, no es un problema. Su guión podría verse más o menos así:
fuente
command; echo $?
?command; echo $?
Es una respuesta mucho mejor.command ; echo $?
porqueecho $?
siempre tiene éxito y, por lo tanto, después de eso, ¿el nuevo valor de $? ahora es 0. Hay una manera de mantener el código de retorno original incluso después de mostrarlo, en caso de que este código de retorno original sea útil más tarde (por ejemplo: en un script, es importante verificar el código de retorno antes de decidir cómo continuar). Vea mi respuesta para una de varias soluciones (la mayoría de las respuestas aquí se pueden cambiar de la misma manera)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:
Esto imprime el código de salida del comando dado de manera similar a como lo hace el
time
comando.Al redirigir a
printf
to/dev/tty
en la función, aún podemos usartellexit
redirecciones sin obtener basura en nuestra salida estándar o secuencias de error:Al guardar el código de salida en una variable, podemos devolverlo a la persona que llama:
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):
Pruebas:
(La
local
cosa requiereash
/pdksh
/bash
/zsh
, o puede cambiarlo a lotypeset
que algunos otros shells también entienden).fuente
Use una función de envoltura de shell. Probablemente con un nombre diferente.
(Por supuesto, esto corromperá la salida estándar, por lo tanto, use el
tty
que se muestra en @Kusalananda o no lo use fuera de contextos interactivos).Al desviarse hacia un territorio no portable, algunos shells pueden informar sobre el estado de todos los comandos en una tubería, no solo el último, por ejemplo, en ZSH si desea que se notifiquen fallas de una tubería completa:
TRAPZERR
de lo contrario no se dispara cuando no hay error (en el principal "no hay noticias son buenas noticias").fuente
GNU
time
tiene una opción para esto:Pasa a través del código de salida 1 , a menos que sea eliminado por una señal 2 :
Si desea conocer / manejar la situación de interrupción de la señal, pase
-v
y seleccione el stderr para la cadenaCommand terminated by signal
.1 Gracias a Olivier Dulac por señalar que pasa el código de salida.
2 Además, gracias Stéphane Chazelas por señalar que el código de salida de la señal de muerte no pasa.
fuente
0
embargo, regresa si se mata el comando.256+signum
o384+signum
, o inclusosignum/256
osignum/256+0.5
si se genera un núcleo (en realidad el estado devuelto porwaitpid()
dividido por 256). Algunos darían una representación textual (comosigint
osigquit+core
). Todavía vale la pena discutir sobre el grupo de noticias gnu.coreutils.bugs, estoy de acuerdo.time
no es partecoreutils
, es un paquete en sí mismo con su propia lista de correo de errores ([email protected]))system()
de los awks tradicionales como el que todavía mantiene Brian Kernighan (elk
inawk
) o elnawk
de Solaris, elawk
de FreeBSD que se deriva de eso.awk 'BEGIN{print system("kill -s ABRT $$")}'
salidas0.523438
cuando el tamaño de volcado del núcleo no está limitado. El comportamiento degawk
ha cambiado recientemente, con un comportamiento variable con--traditional
o--posix
(ver también el valor de retorno declose(cmd)
para más variación)No me gustan todas las otras respuestas (aunque me gusta mucho su inteligencia): muestran el código de salida pero también lo CAMBIAN. (la parte que se muestra es verdadera, por lo tanto, después de esto, el código de retorno es 0)
Aquí hay una versión modificada:
fuente
time
cual no siempre está disponible.Para ser un poco más robusto, envíe el estado de salida a un FD separado para que pueda manejarse independientemente de stdout / stderr:
Tenga en cuenta que tendrá que hacer algo con FD3 o dirá
Bad file descriptor
.Esto podría configurarse aún más para proporcionar estas salidas a las entradas de otro programa haciendo que el otro programa escuche en más de un FD; podrías usar esto como una especie de Kibana de principios de los 90 :)
fuente
Si bien todas las otras respuestas (muy interesantes) abordan la pregunta exacta que hizo el OP, en la práctica, las cosas suelen ser más simples. Simplemente guarde el estado de salida en una variable (inmediatamente después del comando) e informe o inicie sesión de la forma que desee. Por ejemplo, imprimir en / dev / stderr o escribir / agregarlo como un mensaje de texto en un archivo de registro. Y también se conserva para su uso en la toma de decisiones / control de flujo en el código posterior.
Si está en una función:
Si está directamente en un script:
(Agachándose y cubriéndose porque esto no responde la pregunta exacta ).
fuente