Comment puis-je arrêter une couleur bash shell PS1 pour arrêter à la fin de la commande?

12

J'ai une couleur PS1 personnalisée où j'ai les commandes shell réelles dans une couleur distincte, juste pour que je puisse voir rapidement quelles commandes j'ai tapées et les séparer de la sortie de commande elle-même.

Supposons que la couleur dans PS1 soit définie sur «bleu» pour l'invite de commande et que la couleur par défaut dans ma coque soit blanche.

  • Je tape une commande, par exemple ls, (ls -l est coloré en bleu)
  • La sortie qu'il génère, la première ligne est toujours bleue
  • Toute la ligne restante est blanche

Ce que je veux, c'est que toutes les sorties après la commande soient «blanches».

Un autre exemple:

  • Je tape une commande 'chat', la couleur est bleue
  • La sortie vient, toute la sortie est bleue

Je voudrais que la sortie soit «blanche» tout en gardant l'invite de commande que j'ai tapé «bleu»

Sur certaines commandes, c'est bien, d'autres commandes, la même couleur déborde dans la première ligne de la sortie, puis la couleur par défaut entre en action et certaines autres commandes, la sortie entière (par exemple cat) a la même couleur.

Existe-t-il un moyen de conserver uniquement les commandes que j'ai tapées dans une seule couleur et le reste à la valeur par défaut?

Je suis sur OSX.

EDIT # 1

Voici une capture d'écran à laquelle @ derobert est liée dans les commentaires qui montre ce que je recherche.

                 SS # 1

iQ.
la source
2
Vous devez nous montrer votre invite afin que nous puissions localiser les erreurs.
glenn jackman

Réponses:

14

Vous voulez essentiellement réinitialiser la couleur du terminal juste avant que bash n'exécute la commande. Cela peut être fait avec un trap.

Par exemple:

trap '[[ -t 1 ]] && tput sgr0' DEBUG

Bash exécute l' DEBUGinterruption immédiatement avant la commande, ce qui entraînera tput sgr0(ce qui réinitialise les attributs de formatage) avant chaque commande.

Il [[ -t 1 ]]s'agit d'un contrôle de sécurité pour vous assurer que STDOUT est bien un terminal. Il peut y avoir des cas où le STDOUT de bash n'est pas connecté à un terminal (tuyauterie, ssh distant, etc.), et donc vous ne voulez tputpas envoyer de codes d'échappement de terminal.

Patrick
la source
Où mettez-vous cela? Disons que la PS1 ne fait pas reculer la couleur. Maintenant, comment ajoutez-vous cette ligne pour exécuter cette commande juste après que l'utilisateur ait entré sa commande et appuyé sur Entrée?
polym
1
@polym dans votre .bashrc(ou n'importe où $PS1est défini). Je le mettrais juste à côté de la $PS1définition pour que vous sachiez qu'ils sont liés.
Patrick
ok wow ça marche. Est-il possible que cela se passe mal?
polym
@polym n'est plus
Patrick
brillant, c'est exactement ce dont j'avais besoin pour réinitialiser la couleur du terminal.
iQ.