scripts script programas manejo ejemplos comandos comando cadenas linux bash prompt

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:

  1. obteniendo el valor de $? antes que nada, de lo contrario será anulado
  2. 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 /$?