“Exportar PS1 =” para personalizar el indicador de shell

Quería personalizar mi indicador de shell para incluir el tiempo. Entonces, export PS1='\t\w\$' .

Mi mensaje ahora parece 18:57:37~$ . No sé cómo hacerlo con el [email protected] .

Además, no sé cómo cambiar el color de cada parámetro para \t , \w , etc.

Después de todas las pruebas, ¿cómo puedo volver a establecerlo en el valor predeterminado?

Finalmente, ¿a dónde va la línea de exportación? Busqué en el ~/.profile . Pero no existe la línea de export PS1='\t\w\$' .

PS1 se establece en su ~/.bashrc . Este archivo contiene configuraciones que se aplicarán en cada shell interactivo. Una shell Bash interactiva es lo que obtiene cuando abre una terminal en Ubuntu, a menos que haya configurado una shell predeterminada diferente para su usuario.

En una shell interactiva, necesitamos un indicador, y está bien si nos proporciona información útil, como el directorio de trabajo actual, el usuario actual y el nombre de host, como lo hace el Ubuntu PS1 .

Aquí están las líneas que configuran PS1 en la versión predeterminada de .bashrc para mi sistema, /etc/skel/.bashrc

 # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' fi unset color_prompt force_color_prompt 

Desde PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' puede ver que los códigos de escape para el username de username y el hostname son \u y \h respectivamente

 [email protected]:~$ PS1="\[email protected]\h" [email protected] 

Si desea agregar la hora y el directorio de trabajo actual:

 [email protected]="\[email protected]\h \t \w " [email protected] 10:43:32 ~ 

Para obtener colores, necesitas usar las secuencias de escape de colores. Puedes ver algunos en la asignación color_prompt en .bashrc

 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' 

Por ejemplo, \033[01;34m es azul:

Asignación de PS1

Ups! Ahora, el texto que aparece después es azul también … es mejor cambiarlo de nuevo a blanco:

PS1 con reasignación de color.

Deberíamos rodear las asignaciones de color con corchetes escapados, de lo contrario, Bash pensará que están imprimiendo los caracteres del mensaje y los usará para calcular su tamaño. Esto produce efectos extraños cuando intentas interactuar con tu historial, así que aquí tienes la versión corregida:

 PS1="\[\033[01;34m\]\[email protected]\h \t \w \[\033[00m\]" 

Cuando haya terminado de jugar, puede volver a la configuración predeterminada cerrando el terminal y abriendo uno nuevo 😉 o ejecutando

 source ~/.bashrc 

mi PS1 vuelve a la normalidad

Configuré mi PS1 esta manera usando el código ya en .bashrc , sin comentarlo #force_color_prompt=yes y cambiando los códigos de color. Aquí puedes ver las líneas que he cambiado para configurarlo:

 $ diff .bashrc /etc/skel/.bashrc 46c46 < force_color_prompt=yes --- > #force_color_prompt=yes 60c60 < PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] ' --- > PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' 

(Hay más líneas cambiadas después de esto, pero no son relevantes)

Podría hacer lo mismo, pero añada un \t en la línea color_prompt algún lugar, por ejemplo

 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h \[033[01;36m\]\t \[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] ' 

Para obtener una lista de códigos de escape ANSI para colores y más, consulte esta guía para personalizar el indicador .


Me olvidé de contestar la última parte de tu pregunta.

Finalmente, ¿a dónde va la línea de exportación? Busqué en el ~/.profile . Pero no existe la línea de exportación PS1='\t\w\$'

No estoy seguro de si esperaba ejecutar export VAR=val haría que su ~/.profile se modifique automáticamente. El comando de export nunca hace esto. Exportar una variable solo la pasará al entorno de los comandos ejecutados desde el shell actual. Cuando sale del shell (y todos sus procesos secundarios han salido), todo lo que exportó desde el shell desaparece.

Si desea establecer una variable de entorno de forma permanente, generalmente necesita agregarla a ~/.profile explícitamente. Algunos scripts que puede usar para instalar el software pueden modificar su ~/.profile u otros archivos de configuración de shell.

Pero PS1 no necesita ser exportado al medio ambiente. Al comienzo de mi respuesta, dije que en un shell interactivo necesitamos un aviso, y quise decir que solo los shells interactivos necesitan avisos (porque el prompt ayuda al usuario a interactuar con el shell). Ningún otro comando necesita PS1 .

Podría estar pensando que podría ser útil que la PS1 se pase a cualquier shell secundario del shell actual. Cuando inicia un shell interactivo dentro de un shell ejecutando bash , el nuevo shell no heredará las variables del shell del shell que llama; Sólo sus variables de entorno. Entonces, para pasar variables a un shell secundario, deberíamos export .

Pero la exportación de PS1 generalmente * no pasará su valor a un shell secundario, porque se restablece mediante los archivos de configuración del shell, /etc/bash.bashrc y ~/.bashrc . Entonces, cerrar la terminal (como sugerí antes) no es necesario; incluso ejecutar bash devolverá su prompt a su forma habitual:

 [email protected]:~$ export PS1='\t -> ' 22:43:54 -> bash [email protected]:~$ 

(Si exit este shell, vuelve a aparecer el indicador editado)

* Digo que generalmente, porque, aunque los shells no interactivos siempre desarman PS1 , un shell Bash interactivo mantendrá el valor de PS1 si está configurado. Esto no es obvio, porque como se muestra en el ejemplo anterior, los archivos de configuración suelen restablecerse. Podemos descubrirlo cambiando PS1 y luego iniciando un nuevo shell que no lee nuestros archivos de configuración:

 [email protected]:~$ export PS1='\t -> ' 22:55:04 -> bash --norc 22:55:09 -> 

Entonces, para concluir, no hay una línea de export para PS1 en ~/.profile porque PS1 no es una variable de entorno y no tiene ninguna actividad comercial, ya que solo los shells interactivos lo necesitan, y debido a que los shells interactivos necesitan PS1 , es establecido en ~/.bashrc , porque a menos que se indique lo contrario, todas las carcasas de Bash interactivas son source ~/.bashrc , por lo que ~/.bashrc no necesita export PS1 para que sean heredadas por carcasas secundarias (pero si realmente desea export algún valor de PS1 no sea el de tu .bashrc a un shell secundario, puedes hacerlo impidiendo que el shell .bashrc origen de .bashrc ).


He podido extender mi respuesta gracias a Eliah Kagan, quien explicó cómo Bash trata a PS1 aquí en el chat y con más detalles en esta respuesta .