bash – ¿Utiliza variables para almacenar códigos de color de terminal para PS1?

Pregunta:

En mi .bashrc , utilizo códigos de color de terminal ANSI para colorear varios bits. Se parece a esto:

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

donde virtual_env y git_branch son funciones de bash que git_branch cosas en stdout.

Ahora, para que sea más fácil de leer y modificar, me gustaría almacenar los códigos de color en variables y hacer referencia a ellos, en lugar de incrustarlos directamente en PS1 . Entonces tengo un montón de variables como esta:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

Me gustaría poder escribir algo como:

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

Pero esto no funciona: los códigos de color aparecen en el mensaje, como si se hubieran escapado. Los colores funcionan correctamente si utilizo comillas dobles en su lugar para PS1 , pero el indicador solo cambia cuando utilizo la source ~/.bashrc .

He intentado otras cosas que he visto hacer a la gente: usar printf , usar comillas simples para los colores, poner \[ y \] en PS1 en lugar de la variable de color, pero nada parece funcionar.

¿Cómo puedo usar variables para los códigos de color?

Respuesta:

La solución es hacer que el shell sustituya las variables de color al definir el indicador, pero no las funciones. Para hacer esto, use las comillas dobles como lo intentó originalmente, pero evite los comandos para que no se evalúen hasta que se dibuje el símbolo del sistema.

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

Observe el \ antes del $() en cada comando.

Si hacemos eco de esto, vemos:

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

Como puede ver, se sustituyeron las variables de color, pero no los comandos.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım