¿Cómo hacer que el terminal muestre user @ machine en negrita?

31

He visto en algunas capturas de pantalla (no recuerdo en qué parte de la web) que el terminal puede mostrar las [username@machine /]$letras en negrita. Estoy ansioso por obtener esto también porque siempre me encuentro desplazándome por salidas largas para descubrir con dificultad la primera línea después de mi comando.

¿Cómo puedo poner el nombre de usuario, etc. en negrita o en color?

Benjamín
fuente
¿Puedes aclarar si estás usando bash shell o algún otro shell?
Stephen Quan
Gnome Terminal bash.
Benjamin

Respuestas:

22

Debería poder hacer esto configurando la PS1variable de solicitud en su ~/.bashrcarchivo de esta manera:

PS1='[\u@\h \w]\$ '

Para que sea de color (y posiblemente en negrita, esto depende de si su emulador de terminal lo ha habilitado) necesita agregar códigos de color de escape:

PS1='\[\e[1;91m\][\u@\h \w]\$\[\e[0m\] '

Aquí, todo lo que no se escapa entre las partes 1;91my 0mse coloreará en el 1;91color (rojo negrita). Coloque estos códigos de escape alrededor de diferentes partes de la solicitud para usar diferentes colores, pero recuerde restablecer los colores con 0mo de lo contrario tendrá una salida de terminal de color también. Recuerde obtener el archivo luego para actualizar el shell actual:source ~/.bashrc


fuente
¿Por qué no usar 31 para rojo? 91 no parece ser un código estándar.
jw013
1
@ jw013 El rango 90-97 es equivalente al rango 30-37 si se usa como negrita, es decir, 1;31y 1;91. Con un peso de fuente normal, el rango 90-97 proporciona colores más brillantes que el otro.
45

Encuentra dónde estás PS1 está en .bashrce inserte '\[\e[1m\]'al principio y \[\e[0m\]al final.

  • \[y \]son necesarios para que el shell sepa que el desorden en el interior ocupa 0 espacio en la pantalla, lo que evita un comportamiento mal al hacer la edición de línea. No necesita preocuparse demasiado por eso.
  • \e[se conoce como el CSI (introductor de secuencia de control). Verá que se usa en la mayoría de los códigos enumerados en la página de Wikipedia a la que se hace referencia. \e significa el personaje de escape.
  • Si mira en la tabla SGR en la página de Wikipedia, verá que el 1 es el número para texto brillante / en negrita, y 0 es para restablecer. Por lo tanto, se CSI 1mactiva en negrita y CSI 0mrestablece la fuente para que el resto del texto sea normal.

Wikipedia tiene un completo lista de códigos de escape ANSI que puede usar si su emulador de terminal lo admite.

Editar

Para portabilidad y legibilidad, debe usar tput códigos de escape en lugar de codificación rígida. El único inconveniente es que el tputenfoque no funcionará con terminales que admitan códigos ANSI pero que tengan bases de datos terminfo rotas o faltantes, pero en ese caso el terminal roto es un problema mayor ya que muchas de las aplicaciones de consola que dependen de terminfo pueden no funcionar correctamente.

Aquí hay un ejemplo de lo que hago en mi .bashrc:

# color names for readibility
reset=$(tput sgr0)
bold=$(tput bold)
black=$(tput setaf 0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
user_color=$green
[ "$UID" -eq 0 ] && { user_color=$red; }
PS1="\[$reset\][\[$cyan\]\A\[$reset\]]\[$user_color\]\u@\h(\l)\
\[$white\]:\[$blue\]\W\[$reset\][\[$yellow\]\$?\[$reset\]]\[$white\]\
\\$\[$reset\] "

Así es como se vería una versión genérica mía. El 0es el estado de salida del último comando.

Captura de pantalla de PS1

jw013
fuente
Bonita y explicativa respuesta, +1. Aún así encontré la respuesta de Hesse más al grano, así que la elegí en su lugar.
Benjamin
Cuando intenté esto, me encontré con un problema como que el indicador de Terminal no se ajustaba correctamente . ¿Vos si? ¿Tienes secuencias de escape actualizadas?
Stefan Lasiewski
6

Este es el mensaje predeterminado que obtienes en cygwin bash shell:

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

ingrese la descripción de la imagen aquí

\[\e]0;\w\a\] = Set the Window title to your current working directory
\n            = new line
\[\e[32m\]    = Set text color to green
\u@\h         = display username@hostname
\[\e[33m\]    = Set text color to yellow
\w            = display working directory
\[\e[0m\]     = Reset text color to default
\n            = new line
\$            = display $ prompt

Referencias

Stephen Quan
fuente
Agradable, agregué una nueva línea antes del [usuario @ host] que hace que cada comando sea aún más legible (se debe configurar de manera predeterminada en el terminal imo).
Benjamin
2

Utilizo esta función de shell para obtener atributos de texto en el terminal:

color () {
  if [ -z "$1" -a -z "$2" -a -z "$3" ]; then
    echo "\033[0m"
    return
  fi
  case $1 in
    black)   color_fg=30;;
    red)     color_fg=31;;
    green)   color_fg=32;;
    yellow)  color_fg=33;;
    blue)    color_fg=34;;
    magenta|purple) color_fg=35;;
    cyan)    color_fg=36;;
    white)   color_fg=37;;
    -)       color_fg='';;
    *)       color_fg=39;;
  esac
  case $2 in
    bold)      color_bd=1;;
    italics)   color_bd=3;;
    underline) color_bd=4;;
    inverse)   color_bd=7;;
    strike)    color_bd=9;;
    nobold)      color_bd=22;;
    noitalics)   color_bd=23;;
    nounderline) color_bd=24;;
    noinverse)   color_bd=27;;
    nostrike)    color_bd=29;;
    -)         color_bd='';;
    *)         color_bd=0
  esac
  case $3 in
    black)   color_bg=40;;
    red)     color_bg=41;;
    green)   color_bg=42;;
    yellow)  color_bg=43;;
    blue)    color_bg=44;;
    magenta|purple) color_bg=45;;
    cyan)    color_bg=46;;
    white)   color_bg=47;;
    -)       color_bg='';;
    *)       color_bg=49;;
  esac
  s='\033['
  if [ -n "$color_bd" ]; then
    s="${s}${color_bd}"
    if [ -n "$color_fg" -o -n "$color_bg" ]; then
      s="${s};"
    fi
  fi
  if [ -n "$color_fg" ]; then
    s="${s}${color_fg}"
    if [ -n "$color_bg" ]; then
      s="${s};"
    fi
  fi
  if [ -n "$color_bg" ]; then
    s="${s}${color_bg}"
  fi
  s="${s}m"
  echo "$s"
  unset s color_bd color_bg color_fg
}

Luego para usarlo:

color_reset=`color`
color_grbd=`color green bold`
color_bubd=`color blue bold`
PS1="\[${color_grbd}\][\u@\h]\[${color_reset}\]:\[$color_budb}\]\w\[${color_reset}\]> "

Esto me da [username@hostname]:cwd>dónde username@hostnameestán en negrita verde y en cwdnegrita azul

Arcege
fuente
Gracias por esto. Supongo que también tuve que copiar todo lo anterior en ~/.bashrc?
Benjamin
Sí, lo configuré en mi ~/.bashrcarchivo y lo uso para configurar mi solicitud. Incluso cambio los colores dependiendo del sistema en el que estoy.
Arcege
1

Para que parezca un indicador de Ubuntu predeterminado, agregue

export PS1='\[\e[1;32m\]\u@\h\e[0;39m\]:\e[1;34m\]\w\e[0;39m\]$\[\e[0m\] '

en tus ~/.bashrc .

Esto producirá el conocido verde user@host(negrita), seguido de dos puntos blancos sin negrita, seguido de su directorio de trabajo en negrita azul, seguido de un $signo, un espacio y su comando en letras blancas sin negrita:

Mensaje de Ubuntu Bash

Tobias Feil
fuente