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.