Personnaliser le shell bash: Gras / colorier la commande

13

Il existe un certain nombre de didacticiels / publications en ligne (par exemple, http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) sur la façon de personnaliser votre invite dans bash en définissant PS1. Existe-t-il un moyen de personnaliser la couleur / gras de la commande que je tape?

En d'autres termes, à titre d'exemple, disons que je voulais une invite verte, une commande bleue audacieuse, puis une sortie dans les couleurs par défaut. Dans l'exemple ci-dessous, je sais déjà comment faire " joe>" apparaître en vert, bleu, gras, quelle que soit la configuration PS1. Mais existe-t-il un moyen de faire en sorte que le git statusspectacle soit aussi audacieux par exemple?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...
jlarson
la source
Si vous voulez un très bon shell, vous devez utiliser zsh, ce que vous voulez réaliser serait très simple avecpreexec() { printf '\e[0m' }
bollovan
3
@bollovan - 'Vraiment bien' est un peu subjectif, je le trouve vraiment détestable à cause de son ballonnement et de sa non-conformité POSIX. Mais, quoi que flotte votre bateau.
Chris Down
@ChrisDown ballonnement flotte votre bateau - jamais entendu, assez amusant.
n611x007

Réponses:

13

Vous devez laisser une couleur après la PS1 (la démarrer après >dans votre exemple), puis utiliser le bash DEBUGtrap pour effacer la couleur avant l'exécution de votre commande (mais après avoir appuyé sur Entrée dans votre shell. Essayez quelque chose comme ceci :

shopt -s extdebug
trap "tput sgr0" DEBUG
Chris Down
la source
pour quelqu'un étranger d'échapper aux codes: cela conserverait-il la couleur d'origine de la commande (par exemple, serait ls --color=alwayscolorée)?
n611x007
@naxa - Oui, car cela définit explicitement les codes de couleur (sauf pour les couleurs qui sont colorées dans la couleur de terminal par défaut, qui ne prend effet qu'après la première couleur).
Chris Down
Cette astuce semble interférer avec la complétion des onglets (imprime des choses étranges comme ^[(B^[[m). Cela ne se produit cependant que sur certains systèmes: j'ai testé cela sur deux systèmes, tous deux exécutant Ubuntu 12.04 LTS, et un seul d'entre eux avait l'interférence.
musiphil
7

Pour être complet, voici comment définir une couleur d'invite et la couleur d'entrée de ligne de commande dans bash. Mettez ces lignes dans votre .bashrc.

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

Le piège DEBUG, comme suggéré par Chris Down , est utilisé pour réinitialiser les attributs de texte. Il est destiné au débogage, mais il est également utile d'exécuter du code avant d'exécuter la commande tapée par l'utilisateur .

Dans le paramètre d'invite:

  • \[…\] est utilisé autour des séquences d'échappement pour dire à bash qu'ils n'utilisent aucun espace d'écran (sans eux, l'écran se brouille lorsque bash doit redessiner l'invite).
  • \e[…mest un nombre, ou plus généralement une séquence de nombres séparés par des points-virgules, est une séquence d'échappement envoyée au terminal pour affecter la couleur et les autres attributs du texte suivant. Par exemple, 1;34définit un bleu gras; 0;32réinitialise tous les attributs, puis passe la couleur au vert. Ajustez au goût.
  • \w\$imprimer le répertoire courant et $ou #. Vous pouvez bien sûr changer cela en ce que vous voulez et insérer des changements d'attribut de texte entre les deux si vous le souhaitez.
  • Il y a un dernier changement d'attribut à la fin, qui définit la couleur de la saisie de texte.
Gilles 'SO- arrête d'être méchant'
la source
Pour info, les codes / séquences de couleurs bash peuvent être consultés ici: misc.flogisoft.com/bash/tip_colors_and_formatting
kaiwan
0

J'apprends les commandes BASH et je suis assis ici à jouer avec les commandes de couleur dans ma version. J'ai trouvé cette solution:

En utilisant cette commande:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Déconstruire: PS1 =: démarre la commande PS1

'': contient la commande entre guillemets simples (donc BASH ne pense pas que ce soit une commande pour elle)

\: chaque commande individuelle commence par ceci

[]: contient chaque commande

\ e (peut également être \ 033 un caractère d'échappement ASCII): démarre une commande de couleur

La commande color précède la chose à laquelle elle s'applique.

[\ e [0; 36m]: cyan

\ h: nom d'hôte

'>': imprimé après le nom d'hôte

[\ e [0; 31m]: rouge

Apparemment, la commande rouge à la fin rend l'entrée rouge. Changez juste les couleurs à votre goût et c'est ce que vous cherchez.

De plus, ce site m'a un peu aidé:

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

Ma version: GNU bash, v. 4.2.46

Prends soin de toi,

Belette

Belette
la source