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


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

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

Ce serait très utile, par exemple, pour essayer de compiler des programmes comportant des erreurs, car des messages longs et non formatés compliquent la distinction entre les lignes et les commandes.

Colors in osx terminal


96
2018-04-18 22:51


origine


Vous cherchez bash paramètres (ou les paramètres de votre shell préféré), pas Gnome Terminal. - Scott Severance


Réponses:


Vous pouvez modifier les paramètres en modifiant le fichier: ~/.bashrc.

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

  2. Cherchez la ligne avec #force_color_prompt=yes et décommenter (supprimer le #).

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

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

    Faites attention à la partie \u@\h il dit "user @ host" et le numéro avant \[\033[01;32m\] indique 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. Modifiez 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:
enter image description here

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 léger 1; 36
Rouge 0; 31 rouge clair 1; 31
Violet 0; 35 Light Purple 1; 35
Marron 0; 33 Jaune 1; 33
Gris clair 0; 37 Blanc 1; 37

Les références: 1, 2.


121
2018-04-19 01:56



A travaillé parfaitement, merci :) - Luiz Rodrigo
Je suis content que ça marche. Bienvenue. - desgua
Il convient également de mentionner que vous ne devez pas changer la couleur Palette du terminal Preferences avant d'essayer ceci, car cela entraînerait beaucoup de confusion avec les codes de couleur. - Rifaz Nahiyan


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 celles de votre propre système, mais c'est un petit problème. Avec le code généré, vous pouvez modifier 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 pour 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 rend plus clair le début d'une nouvelle commande, en cas de sortie longue.


31
2017-11-13 11:59



Générateur PS1: +1: D - anishsane
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 l'écran entier - Damian Lattenero
Cela a bien fonctionné! Cependant, comment puis-je le faire pour des hôtes spécifiques? c'est-à-dire définir un schéma 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 une manière plus élégante? - Acapulco


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

En bref, vous pouvez modifier l'invite en éditant la variable d'environnement $ PS1. Il y a tellement de choses à dire ici, que je vous montrerai simplement mon invite et vous renverrai au lien ci-dessus pour plus de détails.

Les parties liées à 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 des noms de répertoire abrégés (voir la fonction bash_prompt_shortener), affichage automatique du statut de sortie de la dernière commande si non nul (fonction checkExitStatus), et affichage de l'heure dans les colonnes les plus à droite (fonction print_prompt_time).


6
2018-04-19 00:27



Merci d'avoir partagé vos fonctions personnalisées :) Est-ce seulement avec moi que l'horodatage disparaît lorsque j'appuie sur Backspace? - Luiz Rodrigo
Nan. Moi aussi. Il y a un bug que je n'ai pas jugé suffisamment important pour essayer de corriger. - Scott Severance