Imprimir valor de retorno después de la ejecución del programa


9

Me pregunto cómo configurar la opción para imprimir automáticamente el valor de retorno después de cada ejecución del programa en la terminal sin escribir echo $?.

¿Es algo que se puede configurar? Codeblocks tiene esa característica.

Respuestas:


10

Sí, hay dos formas. Una de ellas es conjunto PROMPT_COMMANDen .bashrcel otro - para configurar la sustitución de comandos en PS1el echo $?comando.

Método 1:

Desde la página de manual de bash:

PROMPT_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary prompt.

Independientemente de lo que establezca esta variable, se ejecutará antes de dibujar la solicitud cada vez. Manifestación:

$> PROMPT_COMMAND=" echo 'Last command exited with'  \$? 'code'  "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$> 

Tenga en cuenta el uso de \$?. Para un cambio permanente, guárdelo en.bashrc

Método 2

Supongamos que mi PS1solicitud se establece así:

PS1='
user@ubuntu:$> '

Si quiero ejecutar algún programa cada vez que este indicador se vuelve a dibujar en la pantalla (que es después de que se ejecuta cada comando anterior), necesitaría usarlo command substitution $(. . .) y configurarlo en el indicador de la siguiente manera:

PS1=' [ $? ] 
user@ubuntu: $> '

Manifestación:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 

Tenga en cuenta que dividí mi PS1 en dos líneas, la superior tendrá [ exitcode ]y la inferior $> <blank space>'. Es por eso que hay >antes $> 'en la segunda línea (el inicio >es un PS2aviso para comandos multilínea). Alternativamente, podría hacer algo como esto (observe la $'...'estructura):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 

+1 Eso realmente funciona. No dudo de nadie con una reputación de 27k, pero aparentemente el aviso no es un "comando", ¿entonces usando $? en que no recibe $? restablecer a cero como pensé que podría ser, incluso utilizando el primer método que ejecuta echo sin errores.
— Joe

PS1es solo texto que se imprime antes de recibir la entrada del usuario, nada más que eso. No es inmune a la expansión de parámetros y a las sustituciones de comandos, por lo que puede poner cualquier cosa $(...), por ejemplo, $( pwd )y se mostrará allí. Lo he usado con un script personalizado para mostrar la energía de la batería de la computadora portátil, por ejemplo
— Sergiy Kolodyazhnyy el

@mchid, ¿qué quieres decir?
— Sergiy Kolodyazhnyy

1
@mchid "Antes de emitir cada solicitud principal", por lo tanto, después de que el último comando haya terminado de ejecutarse.
— kos

1
@mchid se ejecuta antes de que se imprima la solicitud, por lo que antes de escribir el siguiente comando.
— Muru

4

Un método que elegí de Arch Wiki es trap ERR. trapse usa en Bash para ejecutar comandos cuando se recibe una señal o para ciertos otros eventos. Se ERRejecuta una captura cada vez que la línea de comando actual termina con un error: el valor de retorno no es 0. (Si terminara normalmente, el valor de retorno obviamente sería 0.)

Así por ejemplo:

trap 'printf "\ncode %d\n\n" $?' ERR

Entonces:

$ echo foo
foo
$ false

code 1

$

(Nota: ningún mensaje después del echocomando que se ejecutó correctamente: ¿qué significa cuando escribo un comando y el terminal no hace nada? )

La sugerencia de Arch Wiki continuó y coloreó el mensaje, para que recibas un mensaje amarillo notable:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

Efecto:

ingrese la descripción de la imagen aquí

En efecto, todo lo que necesito hacer es estar atento a un color amarillo codeen la salida para saber que un comando falló.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.