
Hice una variable PS1 personalizada, lo cual es tremendamente confuso. Aquí está el que está más cerca de estar en pleno funcionamiento:
PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD: \w [\e[1;34m]Esta carpeta tiene \$( /bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') archivos [\e[1;33m]Un total de \$(/bin/ls -lah | /bin/grep -m 1 total | bin/sed 's/total //')b\n`if [ \$ = 0 ]; entonces echo [\e[32m]^_^ [\e[0m] ] Funcionó - [\e[0m]; else echo [\e[31m]O_O[\e[0m]No funcionó - fi`"
Este es el mismo código que el ejemplo de código anterior, pero se ha separado en bloques y comentado para una mejor legibilidad:
#User@Host [Red]
\n\[\e[1;31m\]\u@\H
#Hour [Purple]
\[\e[35m\] \@
#PWD [Green]
\[\e[32m\] PWD: \w
#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files
#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n
#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`
Tratando de explicar el problema:
if
busca una condición que ya no pueda ser falsa después de ejecutar for (por ejemplo)"This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files"
, ya que es verdadera si la última declaración tuvo un final limpio.
¿Cómo puedo hacer que funcione y al mismo tiempo mantener la salida en la misma posición? Si el if se mueve antes de que se ejecute el primer comando, funciona bien.
Pensé en asignar una variable con esa if
condición al inicio de la PS1. Entonces otro if
en su posición juzgaría la variable alternativa que no cambiaría. Pero desafortunadamente no tengo ninguna habilidad con Bash. Ya lo he intentado sin éxito unas mil veces.
Algo como esto (pero bien escrito):
PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\`
...[Some more code in between]...
`if [ \$prev_err = 0 ]
then echo "No error"
else echo "There was an error in the statement."
fi\`"
Algunos ` (caracteres de comillas invertidas) están en lugares incorrectos o se han omitido en el bloque de código anterior.
Respuesta1
Probablemente sea mejor hacer la mayor parte de eso en PROMPT_COMMAND que, para citar el manual de Bash "Si se establece, el valor se ejecuta como un comando antes de emitir cada mensaje principal".
Ver tambiéneste gran ejemplo.
El mio es :-
PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'
que mantiene mi historial sincronizado en las ventanas de la terminal.
Entonces probablemente deberías poner la mayor cantidad posible de funciones dentro de bash solo para simplificar el problema.
Por cierto, es posible que le resulte du -sh .
un poco más útil y más fácil que /bin/ls -lah | /bin/grep -m 1 total
simplemente obtener el uso del archivo.
Respuesta2
mi mensajecontiene varias funciones, como
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'
Eso funciona para ti?