Comment personnaliser .bashrc pour configurer l'invite de commande?

8

Existe-t-il un moyen simple de modifier mon invite Bash pour modifier les couleurs et le texte affiché? J'ai entendu dire que cela se faisait en .bashrc, mais je n'ai trouvé aucun moyen agréable et facile de le modifier. Comment les couleurs sont-elles exprimées en Bash?

Naftuli Kay
la source
Assurez-vous de parcourir bash+prompt, bien que je ne pense pas que nous ayons un tutoriel là-dedans.
Gilles 'SO- arrête d'être méchant'
2
Il existe un bon guide pour configurer une invite de bash de couleur sur le wiki Arch Linux , y compris une liste de couleurs et quelques bons exemples.
jasonwryan

Réponses:

4

J'avais l'habitude d'avoir ceux définis dans mon .bashrc:

export e="\e["

function cls          { echo -n "${e}H${e}J${e}0m"; }
function rcls         { echo -n "${e}H${e}J${e}S${e}H${e}J${e}0m${e}u${e}J"; } # not quite yet !
# rcls only works when no funny codes have been issued in between, i.e. the buffer is clean
# below the current screen. And then there can be issues with the first line of the buffer.

function bright       { echo -n "${e}1m"; }
function normal       { echo -n "${e}0m"; }
function colour       { echo -n "${e}$1;$2;$3m"; }
function black        { echo -n "${e}30m"; }
function bg_black     { echo -n "${e}40m"; }
function red          { echo -n "${e}31m"; }
function bg_red       { echo -n "${e}41m"; }
function green        { echo -n "${e}32m"; }
function bg_green     { echo -n "${e}42m"; }
function yellow       { echo -n "${e}33m"; }
function bg_yellow    { echo -n "${e}43m"; }
function blue         { echo -n "${e}34m"; }
function bg_blue      { echo -n "${e}44m"; }
function magenta      { echo -n "${e}35m"; }
function bg_magenta   { echo -n "${e}45m"; }
function cyan         { echo -n "${e}36m"; }
function bg_cyan      { echo -n "${e}46m"; }
function white        { echo -n "${e}37m"; }
function bg_white     { echo -n "${e}47m"; }
function c_up         { echo -n "${e}$1A"; }
function c_down       { echo -n "${e}$1B"; }    # within
function c_right      { echo -n "${e}$1C"; }
function c_left       { echo -n "${e}$1D"; }    # screen
function c_pos        { echo -n "${e}$1;$2f"; } # [Hf]
function c_line       { echo -n "${e}$1d"; }
function screentop    { echo -n "${e}H"; }      # [Hdf]
function linetop      { echo -n "${e}G"; }
function buffertop    { echo -n "${e}u"; }      # depends on other control characters ?
function tab          { echo -n "${e}I"; }
function backtab      { echo -n "${e}Z"; }
function scrolldown   { echo -n "${e}$1T"; }    # within screen
function scrolldown_B { echo -n "${e}$1L"; }    # scroll down below cursor
function scrollup_B   { echo -n "${e}$1M"; }    # scroll up below cursor
function clear        { echo -n "${e}J"; }      # delete to end of screen
function cleanbuffer  { echo -n "${e}S"; }      # copies first screen to bottom and clears
                                                # everything else above the cursor.
#function xxx { echo -n "${e}xxx"; }

export -f bright normal colour
export -f black bg_black red bg_red green bg_green yellow bg_yellow
export -f blue bg_blue magenta bg_magenta cyan bg_cyan white bg_white
export -f c_up c_down c_right c_left c_pos c_line
export -f screentop linetop buffertop tab backtab
export -f scrolldown scrolldown_B scrollup_B clear cleanbuffer

Vous pouvez ensuite les utiliser par exemple avec:

PS1_init="\n$(bright)$(black)$(hostname):\w\n$(bg_blue)"
PS1_end="$(normal)$(bright)\n\! -> $(normal)$(clear)"
export PS1="$PS1_init"'$(date)'"$PS1_end"

Cela peut vous aider.

La raison pour laquelle je les ai transformées en fonctions plutôt qu'en variables est la paresse. Je voulais juste éviter de taper. Bien sûr, si vous recherchez des variables d'efficacité, ce serait mieux.

En fin de compte, ceux-ci ne conviennent qu'à certains terminaux. Donc, pour toute aide, consultez la documentation de votre terminal, pas celle de bash ou tout autre shell d'ailleurs.

asoundmove
la source
L'une des meilleures définitions bashrc que j'ai vues jusqu'à présent!
theTuxRacer
1
Les variables permettraient d'économiser sur la saisie: bright=$'\e1m'et ainsi de suite. (Sauf si vous avez besoin de compatibilité avec de très anciennes versions qui n'avaient pas la $'…'syntaxe.)
Gilles 'SO- arrête d'être méchant'
@Gilles, vous avez mal compris: je préfère taper blueà l'invite (ou dans un script shell) que echo $blue.
asoundmove
2

Bash utilise le jeu de couleurs Ansi - article Wikipedia: http://en.wikipedia.org/wiki/ANSI_escape_code#Colors

Par exemple, voici mon invite: (J'aime mon invite sur une ligne séparée, mais pas tout le monde. De plus, mes termes ont un fond sombre - ajustez les couleurs si vos termes sont clairs.)

export PS1='\[\e[0;36m\]\u\[\e[0m\]@\[\e[31m\]\h \[\e[0;36m\]\t \[\e[93m\]\w\[\e[36m\] p$$-\!-\$\[\e[0m\]\n\$ '

Les valeurs d'invite spéciales sont décrites dans la page de manuel Bash sous "Invite":

\u  the username of the current user
\h  the hostname up to the first `.'
\t  the current time in 24-hour HH:MM:SS format
\w  the current working  directory,  with 
    $HOME  abbreviated with  a tilde
    (uses the value of the PROMPT_DIRTRIM variable)
$$  PID of the Bash (helps distinguish my many terms.
    Useful, eg, if I have to kill something.
\!  the history number of this command
\n     newline
\$  if the effective UID is 0, a #, otherwise a $
LenW
la source
1
Bash n'utilise pas le jeu de couleurs ansi. C'est le terminal qui implémente les codes d'échappement. Bash fonctionnera sur n'importe quel terminal, il peut donc être préférable d'utiliser tput setf _n_pour obtenir le code d'échappement pour définir la couleur de premier plan.
camh
0

par exemple pour la coloration, vous pouvez faire ceci:

Ajoutez simplement la ligne suivante:

export PS1=" \[\033[34m\]\u@\h \[\033[33m\]\w\[\033[31m\]\[\033[00m\] $ "

Aperçu: entrez la description de l'image ici

Ce sont mes couleurs préférées. Vous pouvez personnaliser chaque partie de la couleur de l'invite en modifiant les mcodes (par exemple 34m) qui sont des codes de couleur ANSI.

Liste des codes couleurs ANSI:

  • Noir: 30m
  • Rouge: 31m
  • Vert: 32m
  • Jaune: 33m
  • Bleu: 34m
  • Violet: 35m
  • Cyan: 36m
  • Blanc: 37m
Shayan Amani
la source
0

Aucune de ces réponses ne m'a aidé à comprendre le fonctionnement de la personnalisation rapide. Voici ce que j'ai rassemblé après quelques heures de recherche dans différents forums, piles, wikis, etc.:

Trouvez votre invite

nano ~/.bashrc

Recherchez votre bashrcpour PS1, soit manuellement ou avec Alt + F . Il s'agit de la première invite bash, ce que vous voyez lorsque vous entrez une commande. PS[2-4]existent également, mais ceux-ci sont rarement utilisés.

Définir les couleurs

Au-dessus de votre PS1ligne, ajoutez ces définitions de couleurs:

# Color Variables
c1='\[\033[0;30m\]' # Non-bold color 1
C1='\[\033[1;30m\]' # Bold color 1
c2='\[\033[0;31m\]' # Non-bold color 2
C2='\[\033[1;31m\]' # Bold color 2
c3='\[\033[0;32m\]' # Non-bold color 3
C3='\[\033[1;32m\]' # Bold color 3
c4='\[\033[0;33m\]' # Non-bold color 4
C4='\[\033[1;33m\]' # Bold color 4
c5='\[\033[0;34m\]' # Non-bold color 5
C5='\[\033[1;34m\]' # Bold color 5
c6='\[\033[0;35m\]' # Non-bold color 6
C6='\[\033[1;35m\]' # Bold color 6
c7='\[\033[0;36m\]' # Non-bold color 7
C7='\[\033[1;36m\]' # Bold color 7
c8='\[\033[0;37m\]' # Non-bold color 8
C8='\[\033[1;37m\]' # Bold color 8
NC='\[\033[0m\]'    # Back to default color

Configurer les couleurs

Maintenant, dans votre terminal (probablement graphique), vous devriez avoir une option de personnalisation. Par exemple, j'utilise Konsole de KDE : Settings > Edit Current Profile... > Appearance > Edit...montre cette interface de personnalisation:

Personnalisation des couleurs Konsole

Maintenant, changez-les en toutes les couleurs que vous aimez. Votre premier plan est votre couleur par défaut et les couleurs 1 à 8 sont celles que vous avez définies et que vous pouvez choisir. Non pas que les définitions soient basées sur 0 alors que cette personnalisation et vos variables sont basées sur 1.

Utilisez les couleurs dans votre invite

Pour mon invite par défaut, j'ai:

PS1="[\u@\h \W]\$ "

\uest votre u sername, \hest votre h ostname, \West W ici vous (quel répertoire), et \$est le thingy rapide ( #quand userid = 0 [root]).

Vous pouvez personnaliser cela en ajoutant $c1, $ c2`, etc. devant la couleur que vous souhaitez modifier. Par exemple, j'ai:

PS1="$c2[$C8\u$c2@$C7\h $C6\W$c2]$C2\$$NC "

Il en résulte:

Mon invite bash

Remarque: vous devez utiliser NCà la fin pour le réinitialiser à votre couleur par défaut, sinon tout ce qui se trouve après votre invite (votre entrée) sera la dernière couleur de votre invite.

Raymo111
la source