Modification des couleurs pour les informations utilisateur, hôte et répertoire dans l'invite de commande du terminal

104

Est-il possible de changer les couleurs dans l'invite de commande pour l' user@computeraffichage, ainsi que dans le répertoire actuel et les parties de commande de l'invite?

J'ai déjà vu quelque chose comme ceci faite par les utilisateurs d'OSX, mais je ne sais pas comment faire la même chose dans le terminal gnome (je ne peux changer que les couleurs de premier plan et d'arrière-plan).

Cela serait très utile lorsque, par exemple, vous essayez de compiler des programmes qui contiennent des erreurs, car de longs messages non formatés rendent difficile la distinction entre les lignes qui sont des commandes et celles qui sont sorties.

Couleurs dans le terminal osx

Luiz Rodrigo
la source
1
Vous recherchez des bashparamètres (ou des paramètres pour votre shell préféré), pas Gnome Terminal.
Scott Severance

Réponses:

135

Vous pouvez modifier les paramètres d' édition du fichier: ~/.bashrc.

  1. Ouvrez le fichier: gedit ~/.bashrc.

  2. Recherchez la ligne avec #force_color_prompt=yeset décommentez (supprimez la #).

  3. Recherchez la ligne ci if [ "$color_prompt" = yes ]; then- dessous qui devrait ressembler à:

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

    Faites attention à la partie où \u@\hil est écrit "utilisateur @ hôte" et au chiffre qui précède \[\033[01;32m\]la couleur. C'est ce que vous devez changer. Par exemple, modifions l'utilisateur en violet, le "@" en noir et l'hôte en vert. Editez la ligne pour qu'elle ressemble à:

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

Résultat:
entrez la description de l'image ici

Les numéros de couleurs sont:

Noir 0; 30 Gris foncé 1; 30
Bleu 0; 34 Bleu Clair 1; 34
Vert 0; 32 Vert clair 1; 32
Cyan 0; 36 Cyan Clair 1; 36
Rouge 0; 31 Rouge clair 1; 31
Violet 0; 35 Violet Clair 1; 35
Brown 0; 33 Jaune 1; 33
Gris clair 0; 37 Blanc 1; 37

Références: 1 , 2 .

desgua
la source
Je suis content que ça marche. Bienvenue.
Desgua
Il est également intéressant de mentionner que vous ne devriez pas changer la couleur Palettede celle du terminal Preferencesavant d’essayer, car cela causerait beaucoup de confusion avec les codes de couleur.
Rifaz Nahiyan
Mais comment pouvons-nous faire en sorte qu'une chaîne particulière apparaisse dans une couleur particulière? Comme par exemple, il y a un message d'erreur qui est imprimé dans un format spécifique, que je veux voir en rouge. OU Dans GDB, lorsque je vois un message du type "avertissement: le fichier source est plus récent que l’exécutable", je souhaite l’afficher en rouge. Comment cela peut il etre accompli?
Darshan L
36

Vous pouvez essayer le BashrcGenerator . C’est de loin le moyen le plus simple d’obtenir une invite comme vous le souhaitez. J'ai remarqué que les couleurs définies ici peuvent être différentes de votre propre système, mais c'est un petit problème. Avec le code généré, vous pouvez changer les couleurs vous-même.

Utilisateur du serveur:

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\]"

Racine du serveur:

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\]"

Et si nécessaire, vous pouvez modifier la couleur du nom d’hôte afin de refléter différents types de serveurs.

J'utilise un format différent pour mon ordinateur 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\]"

Mon préféré maintenant:

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$ "

Cette dernière invite a une belle touche. Il ajoute une nouvelle ligne après l'invite et une nouvelle ligne vide avant. Maintenant, vous pouvez afficher le chemin complet du répertoire sans problème, et cela indique plus clairement le début d'une nouvelle commande, en cas de sortie longue.

SPRBRN
la source
5
Générateur PS1: +1: D
anishsane
1
vraiment vraiment aimé le dernier, j'étais inquiet parce que le nom d'utilisateur et le chemin m'a pris beaucoup d'espace, avec la dernière option, vous pouvez obtenir tout l'écran
Damián Rafael Lattenero
Cela a très bien fonctionné! Cependant, comment puis-je le faire pour des hôtes spécifiques? Par exemple, définir un jeu de couleurs spécifique lorsque je ssh sur un serveur de production, par exemple? dois-je le faire "manuellement" avec des blocs if-fi dans .bashrc? ou y a-t-il un moyen plus élégant?
Acapulco
Sur chaque hôte auquel vous vous connectez, disposez d'un fichier .bashrc personnel pour cet utilisateur distant et pouvez le modifier. Si vous devenez root, cela a ses propres paramètres, ce qui sera vu par les autres utilisateurs s'ils deviennent root.
SPRBRN
6

Pour plus de détails, voir ce HOWTO détaillé .

En bref, vous pouvez modifier l’invite en modifiant la variable d’environnement $ PS1. Il y a tellement de choses à dire ici, que je vais simplement vous montrer mon invite et vous référer au lien ci-dessus pour plus de détails.

Les parties relatives à la couleur sont dans la fonction 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

En plus des couleurs, mon invite comporte quelques autres fonctionnalités, telles que les noms de répertoire abrégés (voir la fonction bash_prompt_shortener), l'affichage automatique du statut de sortie de la dernière commande s'il est différent de zéro (fonction checkExitStatus) et l'affichage de l'heure dans les colonnes les plus à droite (fonction print_prompt_time) .

Scott Severance
la source
Merci de partager vos fonctions personnalisées :) Est-ce seulement avec moi que l'horodatage disparaît lorsque j'appuie sur la touche Retour arrière?
Luiz Rodrigo
Nan. Moi aussi. Il y a un bug que je n'ai pas jugé assez important pour essayer de le réparer.
Scott Severance