linux - script - Mensaje de Bash con el último código de salida
script linux ejemplos (4)
Cuando comience a bordear una PS1 compleja, podría considerar el uso de PROMPT_COMMAND
.
Con esto, lo establece en una función, y se ejecutará después de cada comando para generar el indicador.
Puedes probar lo siguiente en tu ~/.bashrc
PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
__prompt_command() {
local EXIT="$?" # This needs to be first
PS1=""
local RCol=''/[/e[0m/]''
local Red=''/[/e[0;31m/]''
local Gre=''/[/e[0;32m/]''
local BYel=''/[/e[1;33m/]''
local BBlu=''/[/e[1;34m/]''
local Pur=''/[/e[0;35m/]''
if [ $EXIT != 0 ]; then
PS1+="${Red}/u${RCol}" # Add red if exit code non 0
else
PS1+="${Gre}/u${RCol}"
fi
PS1+="${RCol}@${BBlu}/h ${Pur}/W${BYel}$ ${RCol}"
}
Esto debería hacer lo que suene la línea que quieras. Eche un vistazo al subarchivo de mi __prompt_command
si desea ver todas las cosas que hago con mi función __prompt_command
.
Por lo tanto, he estado intentando personalizar mediante el indicador de bash para que se vea como
[feralin@localhost ~]$ _
con colores. Logré obtener colores constantes (los mismos colores cada vez que veo el indicador) pero quiero que el nombre de usuario (''feralin'') aparezca en rojo, en lugar de verde, si el último comando tuvo un estado de salida distinto de cero. Se me ocurrio:
/e[1;33m[$(if [[ $? == 0 ]]; then echo "/e[0;31m"; else echo "/e[0;32m"; fi)/u/e[m@/e[1;34m/h /e[0;35m/W/e[1;33m]$ /e[m
Sin embargo, de mis observaciones, el $(if ...; fi)
parece ser evaluado una vez, cuando se ejecuta .bashrc
, y el resultado se sustituye para siempre. Esto hace que el nombre sea siempre verde, incluso si el último código de salida es distinto de cero (como en, echo $?
). ¿Es esto lo que está pasando? ¿O es simplemente algo más mal con mi mensaje? Pregunta corta, ¿cómo obtengo mi aviso para usar el último código de salida?
Mejora @demure
Creo que esto es importante porque no siempre el estado de salida es 0 o 1.
if [ $EXIT != 0 ]; then
PS1+="${Red}${EXIT}:/u${RCol}" # Add red if exit code != 0
else
PS1+="${Gre}${EXIT}:/u${RCol}" # Also displays exit status
fi
Quería mantener los colores de Debian predeterminados, imprimir el código exacto y solo imprimirlo si fallaba:
# Show exit status on failure.
PROMPT_COMMAND=__prompt_command
__prompt_command() {
local curr_exit="$?"
local BRed=''/[/e[0;91m/]''
local RCol=''/[/e[0m/]''
PS1=''${debian_chroot:+($debian_chroot)}/[/033[01;32m/]/u@/h/[/033[00m/]:/[/033[01;34m/]/w/[/033[00m/]/$ ''
if [ "$curr_exit" != 0 ]; then
PS1="[${BRed}$curr_exit${RCol}]$PS1"
fi
}
Si no desea utilizar el comando prompt, hay dos cosas que debe tener en cuenta:
- obteniendo el valor de $? antes que nada, de lo contrario será anulado
- escapando de todos los $ ''s en la PS1 (por lo que no se evalúa cuando lo asignas)
Ejemplo de trabajo usando una variable
PS1="/$(VALU="/$?" ; echo /$VALU ; date ; if [ /$VALU == 0 ]; then echo zero; else echo nonzero; fi) "
Ejemplo de trabajo sin una variable
Aquí el if debe ser lo primero, antes de cualquier comando que anule el $?
.
PS1="/$(if [ /$? == 0 ]; then echo zero; else echo nonzero; fi) "
Observe cómo se escapa el /$()
por lo que no se ejecuta de inmediato, sino cada vez que se usa PS1. También todos los usos de /$?