Comment faire pour que le terminal affiche user @ machine en caractères gras?

31

J'ai vu dans certaines captures d'écran (je ne me souviens plus où sur le web) que le terminal peut afficher les [username@machine /]$caractères gras. J'ai hâte de l'avoir aussi parce que je me retrouve toujours à faire défiler de longues sorties pour trouver avec difficulté la première ligne après ma commande.

Comment puis-je mettre le nom d'utilisateur, etc. en gras ou en couleur?

Benjoin
la source
Pouvez-vous préciser si vous utilisez le shell bash ou un autre shell?
Stephen Quan
Gnome Terminal bash.
Benjamin

Réponses:

22

Vous devriez pouvoir le faire en définissant la PS1variable d'invite dans votre ~/.bashrcfichier comme ceci:

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

Pour le rendre coloré (et éventuellement en gras - cela dépend si votre émulateur de terminal l'a activé), vous devez ajouter des codes de couleur d'échappement:

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

Ici, tout ce qui ne s'échappe pas entre les parties 1;91met 0msera coloré dans la 1;91couleur (rouge gras). Mettez ces codes d'échappement autour de différentes parties de l'invite pour utiliser des couleurs différentes, mais n'oubliez pas de réinitialiser les couleurs avec 0mou sinon vous aurez également une sortie de terminal colorée. N'oubliez pas de vous procurer le fichier par la suite pour mettre à jour le shell actuel:source ~/.bashrc


la source
Pourquoi ne pas utiliser 31 pour le rouge? 91 ne semble pas être un code standard.
jw013
1
@ jw013 La plage 90-97 est équivalente à la plage 30-37 si elle est utilisée en gras ie 1;31et 1;91. En utilisant un poids de police normal, la plage 90-97 donne des couleurs plus brillantes les unes que les autres.
45

Trouvez où votre PS1est placé dans votre .bashrcet insérez '\[\e[1m\]'au début et \[\e[0m\]à la fin.

  • \[et \]sont nécessaires pour que le shell sache que le gâchis à l'intérieur prend 0 espace sur l'écran, ce qui empêche certains comportements foirés lors de l'édition de ligne. Vous n'avez pas besoin de trop vous en préoccuper.
  • \e[est connu sous le nom de CSI (control sequence introducer). Vous le verrez utilisé dans la plupart des codes répertoriés sur la page Wikipedia référencée. \e signifie le caractère d'échappement.
  • Si vous regardez dans le tableau SGR sur la page Wikipedia, vous verrez que le 1 est le numéro pour le texte clair / gras et 0 pour la réinitialisation. CSI 1mActive ainsi le gras et CSI 0mréinitialise la police pour que le reste de votre texte soit normal.

Wikipedia a une liste complète des codes d'échappement ANSI que vous pouvez utiliser si votre émulateur de terminal le prend en charge.

modifier

Pour la portabilité et la lisibilité, vous devez utiliser tputau lieu de codes d'échappement codés en dur. Le seul inconvénient est que l' tputapproche ne fonctionnera pas avec les terminaux qui prennent en charge les codes ANSI mais qui ont des bases de données terminfo cassées ou manquantes, mais dans ce cas, le terminfo cassé est un problème plus important car la plupart de vos applications de console qui reposent sur terminfo peuvent ne pas fonctionner correctement.

Voici un exemple de ce que je fais dans mon .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\] "

Voici à quoi ressemblerait une version générique de la mienne. Le 0est l'état de sortie de la dernière commande.

Capture d'écran PS1

jw013
la source
Réponse agréable et explicative, +1. J'ai quand même trouvé la réponse de Hesse plus précise, alors je l'ai choisie à la place.
Benjamin
Lorsque j'ai essayé cela, j'ai rencontré un problème tel que l' invite du terminal ne s'emballe pas correctement . Le faites vous? Avez-vous mis à jour des séquences d'échappement?
Stefan Lasiewski
6

Il s'agit de l'invite par défaut que vous obtenez dans le shell bash cygwin:

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

entrez la description de l'image ici

\[\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

Les références:

Stephen Quan
la source
Bien, j'ai ajouté une nouvelle ligne avant [user @ host] qui rend chaque commande encore plus lisible (elle devrait être définie par défaut sur le terminal imo).
Benjamin
2

J'utilise cette fonction shell pour obtenir des attributs de texte dans le 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
}

Ensuite pour l'utiliser:

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

Cela me donne [username@hostname]:cwd>username@hostnamesont vert vif et cwdbleu vif.

Arcege
la source
Merci pour cela. Je suppose que j'ai également dû copier tout ce qui précède dans ~/.bashrc?
Benjamin
Oui, je l'ai défini dans mon ~/.bashrcfichier et l'utiliser pour définir mon invite. Je change même les couleurs en fonction du système sur lequel je suis.
Arcege
1

Pour le faire ressembler à une invite Ubuntu par défaut, ajoutez

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

dans votre ~/.bashrc.

Cela produira le vert bien connu user@host(gras), suivi d'un deux-points blanc non gras, suivi de votre répertoire de travail en bleu gras, suivi d'un $signe, d'un espace et de votre commande en lettres blanches non gras:

Invite Ubuntu Bash

Tobias Feil
la source