¿Cómo configurar bash para imprimir el estado de salida de cada comando?

12

Cada comando ejecutado en bash regresa con un código de salida.

Cada vez que escribo un comando en bash prompt, quiero que muestre el estado de salida, es decir, echo $?

por ejemplo, si ejecuto echo "hello";en bash prompt, la salida debería ser:

linux@linux$ hello
linux@linux$ 0
ravidixit
fuente
¿Qué hay de publicar su pregunta en unix.stackexchange.com ?
Gracias @Frank. Pero, ¿no es también un buen lugar para hacer esta pregunta?
ravidixit
Intenté imprimirlo como parte de la variable PS1, pero no funciona por razones que aún no entiendo.
ravidixit

Respuestas:

13

El código de salida del último comando ejecutado se almacena en la $?variable de entorno. Por lo tanto, solo puede agregar esta variable al símbolo del sistema predeterminado y siempre tendrá el código de salida impreso allí. La solicitud se almacena en la $PS1variable de entorno. Inicialmente se establece en el /etc/bash.bashrcscript y luego en el $HOME/.bashrc.

Así que edite la línea en $HOME/.bashrc( /etc/bash.bashrcsería todo el sistema) desde su valor predeterminado:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

a esto (por ejemplo):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '

Entonces, la solicitud predeterminada cambió a:

user@host:/path/to/dir[0] $

El 0 entre paréntesis es su código de salida, vea:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

Para los significados ver http://www.tldp.org/LDP/abs/html/exitcodes.html

caos
fuente
Intenté hacerlo, pero para la fiesta en cuestión, no funciona. siempre muestra [0] para la máquina en la que estoy trabajando.
ravidixit
¿Estás seguro de que ejecutas una fiesta? ¿Puedes copiar la salida de readlink /proc/$$/exepor favor? 0 significa que no hay error, ¿has intentado algo que da un error: ^Co falseo asdasdasd?
caos
1
@chaos Tengo mi PS1 como PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), pero solo se muestra 0todo el tiempo. ¿Alguna idea de por qué?
Max
1
Sería bueno, si el estado de salida solo se mostrara, si es desigual 0
rubo77
1
@max Es porque $?ya está expandido a 0cuando configura su PS1. Haz echo $PS1y verás. Tienes que sea para uso comillas simples, o escapar de ella como \$?.
wisbucky
7

Otra forma que elegí de Arch Wiki fue usar trap:

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

Efecto:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$
muru
fuente
2
Eso no cumple con los requisitos del OP, ya que quiere imprimir el estado de salida incluso si es cero, pero es exactamente lo que he estado buscando.
Keith Thompson
2

Aquí hay un ejemplo simple:

PS1='$? > '

Si usa comillas dobles, entonces debe agregar una barra invertida para escapar de $:

PS1="\$? > "

Salida:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

Una forma aún mejor es imprimir solo el código de salida cuando no es cero.

PS1='${?#0}> '    # single quote example
PS1="\${?#0}> "   # double quote example (requires extra backslash)

Salida de muestra:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

Explicación: ${var#pattern}es una expansión de parámetros bash que significa eliminar el patrón de coincidencia más corto del frente de $ var. Entonces, en este caso, estamos eliminando 0desde el frente de $?, lo que efectivamente truncaría un código de salida de 0.

Si usa comillas dobles, $?se sustituirá cuando PS1se establece, en lugar de ser evaluado cada vez. Haga echo $PS1para confirmar que no tiene un valor codificado PS1.

Wisbucky
fuente
Gracias desde enero de 2018. Quiero el mensaje normal con el código de salida al principio si no es cero, esto ayuda mucho.
SDsolar