Cambio de colores para usuario, host, información de directorio en el símbolo del sistema

104

¿Es posible cambiar los colores en el símbolo del sistema para user@computer, así como el directorio actual y las partes del comando de la pantalla del símbolo?

Ya he visto algo así hecho por los usuarios de OSX, pero no sé cómo hacer lo mismo en la terminal de GNOME (solo puedo cambiar los colores de primer plano y de fondo).

Sería muy útil cuando, por ejemplo, intente compilar programas que tienen errores, ya que los mensajes largos y sin formato dificultan distinguir qué líneas son comandos y cuáles se envían.

Colores en terminal osx

Luiz Rodrigo
fuente
1
Estás buscando bashconfiguraciones (o configuraciones para tu shell preferido), no Gnome Terminal.
Scott Severance

Respuestas:

135

Puede editar la configuración de la edición del archivo: ~/.bashrc.

  1. Abrir el archivo: gedit ~/.bashrc.

  2. Busque la línea con #force_color_prompt=yesy sin comentarios (elimine el #).

  3. Busque la siguiente línea if [ "$color_prompt" = yes ]; thenque debería verse así:

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

    Preste atención a la parte \u@\hque dice "usuario @ host" y al número antes de que \[\033[01;32m\]indique el color. Esto es lo que tienes que cambiar. Por ejemplo, cambiemos el usuario a púrpura, la "@" a negra y el host a verde. Edite la línea para que se vea así:

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u\[\033[01;30m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Resultado:
ingrese la descripción de la imagen aquí

Los números de colores son:

Negro 0; 30 Gris oscuro 1; 30
Azul 0; 34 Azul claro 1; 34
Verde 0; 32 Verde claro 1; 32
Cian 0; 36 Cian claro 1; 36
Rojo 0; 31 Rojo claro 1; 31
Púrpura 0; 35 Púrpura claro 1; 35
Marrón 0; 33 Amarillo 1; 33
Gris claro 0; 37 Blanco 1; 37

Referencias: 1 , 2 .

desgua
fuente
Me alegra que funcione. Bienvenidos.
desgua
También vale la pena mencionar que no debe cambiar el color Palettede la Terminal Preferencesantes de intentar esto, ya que causará mucha confusión con los códigos de color.
Rifaz Nahiyan
Pero, ¿cómo podemos hacer que una cadena particular aparezca en un color particular? Como decir, hay un mensaje de error que se imprime en un formato específico, que quiero ver en color rojo. O bien, en GDB, cuando veo un mensaje como "Advertencia: el archivo de origen es más reciente que el ejecutable", quiero que se muestre en color rojo. ¿Cómo se puede lograr esto?
Darshan L
36

Puedes probar el BashrcGenerator . Esta es, con mucho, la forma más fácil de obtener un aviso como lo desea. Me di cuenta de que los colores definidos aquí pueden ser diferentes a los de su propio sistema, pero eso es un problema pequeño. Con el código generado puede cambiar los colores usted mismo.

Usuario del servidor:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;32m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

Raíz del servidor:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;31m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

Y si es necesario, puede cambiar el color del nombre de host para reflejar diferentes tipos de servidores.

Utilizo un formato diferente para mi computadora local:

export PS1="\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] > \[\e[0m\]"

Mi favorito ahora:

export PS1="\n\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] \[\e[0m\]\n$ "

Este último mensaje tiene un buen toque. Agrega una nueva línea después de la solicitud y una nueva línea vacía antes. Ahora puede mostrar la ruta completa del directorio sin problemas, y deja más claro dónde comienza un nuevo comando, en caso de una salida larga.

SPRBRN
fuente
55
Generador de PS1: +1: D
anishsane
1
Realmente me gustó el último, estaba preocupado porque el nombre de usuario y la ruta me ocuparon mucho espacio, con la última opción que puedes obtener en toda la pantalla
Damián Rafael Lattenero
Esto funcionó muy bien! sin embargo, ¿cómo puedo hacer esto para hosts específicos? es decir, establecer un esquema de color específico cuando ssh en un servidor de producción por ejemplo? ¿Tengo que hacerlo "manualmente" con bloques if-fi en .bashrc? o hay una manera más elegante?
Acapulco
En cada host que inicie sesión, tenga un archivo .bashrc personal para ese usuario remoto y puede cambiarlo. Si se convierte en root, tiene su propia configuración, que será vista por otros usuarios si se convierten en root.
SPRBRN
6

Para más detalles, vea este CÓMO detallado .

En resumen, puede modificar el aviso editando la variable de entorno $ PS1. Hay tanto que decir aquí, que solo le mostraré mi mensaje y lo remitiré al enlace de arriba para obtener más detalles.

Las partes relacionadas con el color están en la función setPrompt:

# This function from: https://wiki.archlinux.org/index.php/Color_Bash_Prompt_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29#Wolfman.27s
##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff          -> ~/stuff               if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_shortener() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi
}


function setPrompt {
  COLOR1="\[\033[1;33m\]"     #First color
  COLOR2="\[\033[0;33m\]"     #Second color
  NO_COLOR="\[\033[0m\]"      #Transparent - don't change

  case $TERM in 
    xterm*)
      TITLEBAR="\[\033]0;\h - \w\007\]"
      ;;
    *)
      TITLEBAR=""
      ;;
  esac

  local dash_open="${COLOR1}-${COLOR2}-"
  local dash_close="${COLOR2}-${COLOR1}-"
  local spacer="${COLOR2}-"
  local jobs_and_history="${COLOR2}(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})"
  local user_host="${COLOR2}(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})"
  local host="${COLOR2}(${COLOR1}\H${COLOR2})"
  local root_or_not="${COLOR2}(${COLOR1}\\\$${COLOR2})"
  local cwd="${COLOR2}(${COLOR1}\w${COLOR2})"
  #PS1="${TITLEBAR}${COLOR1}-${COLOR2}-(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})-(${COLOR1}\w${COLOR2})-${COLOR1}-\n-${COLOR2}-(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})-(${COLOR1}\\\$${COLOR2})-${COLOR1}- ${NO_COLOR}"
  #PS1="${TITLEBAR}${dash_open}${cwd}${spacer}${root_or_not}${dash_close}\n${dash_open}${jobs_and_history}${spacer}${host}${dash_close}${NO_COLOR} "
  #PS2="${COLOR2}--${COLOR1}- ${NO_COLOR}"
  PS1="${TITLEBAR}${COLOR1}"'${NEW_PWD}'"${COLOR2}:\$${NO_COLOR} "
  PS2="$spacer$dash_close$NO_COLOR "
}

bash_prompt_shortener
setPrompt
unset setPrompt

#Determine and display the exit Status of the last command, if non-zero.
function checkExitStatus() {
  local status="$?"
  local signal=""
  local COLOR1="\033[0;0;33m"     #First color
  local COLOR2="\033[0;0;36m"     #Second color
  local NO_COLOR="\033[0m"        #Transparent - don't change

  if [ ${status} -ne 0 -a ${status} != 128 ]; then
    # If process exited by a signal, determine name of signal.
    if [ ${status} -gt 128 ]; then
      signal="$(builtin kill -l $((${status} - 128)) 2>/dev/null)"
      if [ "$signal" ]; then
        signal="$signal"
      fi
    fi
    echo -e "${COLOR1}[Exit ${COLOR2}${status} ${signal}${COLOR1}]${NO_COLOR}" 1>&2
    #echo -ne "${COLOR1}[Exit ${COLOR2}${status}${COLOR1} ${COLOR2}${signal}${COLOR1}]${NO_COLOR} " 1>&2
    fi
  return 0
}
print_prompt_time() {
    printf "%*s\r" $(tput cols) "$(date '+%T')"
}

promptCmd() {
    checkExitStatus
    print_prompt_time
}

PROMPT_COMMAND=promptCmd

Además de los colores, mi indicador tiene algunas otras características, como nombres de directorio abreviados (vea la función bash_prompt_shortener), visualización automática del estado de salida del último comando si no es cero (función checkExitStatus) y visualización de la hora en las columnas más a la derecha (función print_prompt_time) .

Scott Cesantía
fuente
Gracias por compartir sus funciones personalizadas :) ¿Es solo conmigo que la marca de tiempo desaparece cuando presiono la tecla de retroceso?
Luiz Rodrigo
No. Yo también. Hay algún error que no juzgué lo suficientemente importante como para intentar solucionarlo.
Scott Severance