Couleur différente pour la commande et la sortie

13

Je me demandais s'il était possible de changer la couleur de la sortie d'une commande sous linux en une couleur différente de celle de la ligne de commande où je tape. Il est som monotone et difficile de trouver où commence la sortie. comme,

@USER/Destop$ ----> blue
/*
--------------
output file in white
-----------
*/

Merci

Raj
la source
2
peut-être qu'en utilisant precmd_functions, vous pouvez changer la couleur de l'invite et la redéfinir avant preexec_functions, ou quelque chose comme ça. (en zsh, je ne sais pas s'il y a un équivalent pour d'autres shells)
pataluc
j'ai juste essayé ma suggestion mais je n'ai pas la commande colorée ... :(
pataluc
1
@pataluc: J'ai réussi avec preexec () { echo -n "\\e[40;34m" }; la precmdfonction est IMHO pas nécessaire, il semble que zsh réinitialise la couleur elle-même avant d'afficher l'invite. Mais cela ne fonctionne que pour les commandes qui ne modifieront pas la couleur elle-même (un exemple important est ls) comme l'a souligné Aaron. Avec cat, bc, commandes shell, builtin etc. (même alpine) , cela fonctionne très bien.
mpy
@mpy j'ai réussi aussi, avec toutes les commandes, en supposant que raj veuille colorer la commande et non le résultat, j'ai ajouté "\\e[40;34m"à la fin de mon PROMPTvar, et l' ai remis en blanc avec preexec () { echo -n "\\e[40;37m" }...
pataluc
1
@pataluc: Désolé, je comprends maintenant. Pour colorer la ligne de commande, utilisez simplement zle_highlight=(default:fg=cyan)une version récente de zsh. Zsh propose également une coloration dynamique, comme fish; voir la section POINTS SAILLANTS DU PERSONNAGE dans man zshzle.
mpy

Réponses:

5

Pas vraiment; la couleur de la sortie d'un programme donné est contrôlée par la commande et non par le terminal.

Cela dit, en supposant que votre terminal comprend les codes d'échappement ANSI pour la couleur (la plupart le font), vous pouvez utiliser des codes d'échappement pour définir la couleur d'invite souhaitée au début de l'invite et la couleur de sortie souhaitée à la fin; cela entraînerait que vos lignes de commande soient également de la couleur que vous définissez pour la sortie, mais c'est probablement à peu près aussi proche que vous allez obtenir ce que vous recherchez. Par exemple, les éléments suivants:

$ export PS1='\[\033[00;35m\]\u\[\033[00m\]@\[\033[00;35m\]\H\[\033[00m\]:\[\033[00;33m\]\W\[\033[00m\] \$\[\033[00;34m '

vous donnera une invite qui ressemble à:

user@host:wd $ _

avec 'user' et 'host' en violet, 'wd' (votre cwd) en marron (jaune foncé), et tout après le '$' dans tout ce que votre terminal utilise pour le bleu clair. (Un xterm par défaut rendra cela en cyan; gnome-terminal semble avoir par défaut une assez belle nuance de bleuet.)

Le code de couleur réel, tel que spécifié dans le format nécessaire pour bash, est, par exemple \[\033[00;35m\], où 00;35est la spécification de couleur réelle; le 00début change rarement, mais peut produire des effets gras (01), souligné (??) et inversé vidéo (??) IIRC, tandis que le '35' de fin est la couleur réelle, qui dans ce cas est le violet.

Il est étonnamment difficile de trouver une liste décente de codes de couleur ANSI, mais les couleurs de premier plan vont de 30 à 37 et celles de fond de 40 à 47, comme suit:

color        fg  bg
black        30  40
red          31  41
green        32  42
yellow       33  43
blue         34  44
purple       35  45
cyan         36  46
gray/white   37  47

Gardez à l'esprit que, puisque vous définissez une couleur par défaut pour tout ce qui suit votre invite, les programmes que vous exécutez qui ne définissent pas leurs propres couleurs via les codes d'échappement vont prendre cette couleur - par exemple, si vous exécutez un pager, vous verrez probablement sa sortie dans la même couleur que celle que vous avez définie pour les autres commandes. Pendant ce temps, les commandes qui ne fixent leurs propres couleurs via des codes d'échappement ignorent entièrement vos efforts.

Aaron Miller
la source
1
Au lieu de codes d'échappement, j'ai trouvé que l'utilisation tputest beaucoup plus lisible pour la colorisation. Par exemple, mon invite (en bash) est celle export PS1="[\t \[$(tput setaf 9)\]\u\[$(tput setaf 15)\]@\[$(tput setaf 12)\]\h \[$(tput sgr0)\]\w ] \$ "qui affiche l'heure, puis le nom d'utilisateur dans une couleur, @dans une autre et le nom d'hôte dans une troisième (rouge, blanc et bleu pour le moment), puis imprime le PWD et $ . Il est très facile de voir d'un coup d'œil où se trouvent les lignes d'invite lorsque vous faites défiler l'historique.
MattDMo
ur génial ... c'est tout ce que je voulais. Merci pourrais-tu me dire quelles valeurs changer si jamais je veux changer de couleur?
raj
et existe-t-il un moyen de conserver le dernier comme avant la couleur?
raj
et pourquoi le changement n'est-il pas permanent, chaque fois que je me connecte, je dois le colorier à nouveau
raj
1
Le changement n'est permanent que si vous l'ajoutez au fichier d'initialisation de votre shell, qui pour bash est ~/.bashrc; recherchez la ligne où il définit PS1, qui est votre chaîne d'invite, et modifiez-la comme décrit dans la réponse. Ce qui change dépend de la façon dont votre chaîne d'invite est configurée, mais la plupart des détails saillants sont dans ma réponse, et le reste peut être trouvé en faisant un peu de recherche sur Google. Je ne suis pas sûr de ce que vous entendez par "y a-t-il un moyen de garder le dernier identique à la couleur d'avant?"
Aaron Miller
7

Vous pouvez passer la sortie à un programme qui fait la coloration. Par exemple, il existe des programmes comme pycolor:

pycolor module.py

Pour construire le vôtre:

red="$(tput setaf 1)"
reset="$(tput sgr0)"
echo $'foo\nbar' | sed -e "s/\(bar\)/$red\1$reset/"

Plus d'informations sur la sortie couleur.

l0b0
la source
3

Oui, cela fonctionne pour bash, sur linux et mac OS au moins.

Tout d'abord, définissez certaines variables d'attribut et l'invite PS1 pour laisser le terminal avec les attributs de ligne de commande souhaités, par exemple:

bold="\[$(tput bold)\]"
none="$(tput sgr0)"
export PS1="\$ $bold"

Ensuite, utilisez le piège bash DEBUG, qui est exécuté juste avant chaque commande, pour modifier les attributs de texte pour la sortie de la commande:

trap 'echo -ne "${none}"' DEBUG
jackpipe
la source
1

Une autre alternative (sur une base de commande par commande) est grc - colorizer générique. Il faut un peu de travail pour configurer les expressions régulières qu'il utilise pour coloriser les choses. Je l'ai découvert ici:

/unix/8414/how-to-have-tail-f-show-colored-output?newsletter=1&nlcode=17737|321c

et ici:

/unix/26313/colored-find-output

Je ne suis pas un flash avec des expressions régulières, donc je n'ai pas beaucoup travaillé avec ces commandes.

Joe
la source
J'utilise cela avec tous mes scripts de journal de queue. Merveilleux.
stefgosselin
1

Jetez-les dans votre fichier .bashrc, puis sourcez le fichier après l'avoir enregistré.

blk=$'\x1b[90m' # Sets text to black
red=$'\x1b[31m' # Sets text to red
grn=$'\x1b[92m' # Sets text to green
ylw=$'\x1b[93m' # Sets text to yellow
blu=$'\x1b[94m' # Sets text to blue
pur=$'\x1b[95m' # Sets text to purple
cyn=$'\x1b[96m' # Sets text to cyan
wht=$'\x1b[97m' # Sets text to white
rst=$'\x1b[0m'  # resets to default terminal color

Une fois cela fait, vous pouvez ensuite utiliser n'importe lequel de ces éléments dans votre terminal de manière permanente ou jusqu'à ce que vous commentiez les variables ou les supprimiez complètement. Vous pouvez les utiliser dans des scripts sur votre machine ou avec une substitution de commande ou autre. Voici un exemple suivant de la façon dont je les utilise personnellement:

echo -e "${red}This text is red.${rst}"
printf "${grn}This text is green.\n${rst"

Je les utilise généralement avec des commandes individuelles echoet / ou printfmais vous pouvez les utiliser pour coloriser d'autres commandes comme la pingcommande. Ajoutez ce qui suit .bashrcpour obtenir les effets. Ensuite, sourcez votre .bashrcfichier et exécutez la cpingcommande à utiliser pingavec du texte violet. Vous pouvez définir chaque fonction de commande pour utiliser n'importe quelle couleur prise en charge par votre terminal.

# Add this to your .bashrc file
colored_ping() {

    echo -e "${pur}$(ping $1)${rst}"
}

alias cping='colored_ping'

Puis essayez:

user@linux:~# cping superuser.com

Votre sortie pour cpingsera violette. Si vous souhaitez utiliser plusieurs couleurs dans la même sortie, vous pouvez les ajouter de manière unique. La façon dont vous le faites dépend entièrement de vous. Par exemple:

echo -e "${red}This is red and ${blu}this is blue and ${grn}this is green.${rst}
Yokai
la source
0

Vous devriez jeter un œil à la commande hl disponible sur git hub:
github: git clone http://github.com/mbornet-hl/hl
et sur:
http://www.flashnux.com/notes/page_000022_US.html
hl est une commande linux écrite en C, spécialement conçue pour colorer un fichier texte ou la sortie d'une commande. Vous pouvez utiliser jusqu'à 42 couleurs simultanément et utiliser un fichier de configuration pour simplifier les lignes de commande. Vous pouvez coloriser la sortie de chaque commande pouvant être redirigée vers une autre. Et si vous savez ce que sont les expressions régulières, il vous sera très facile de les utiliser. Vous pouvez utiliser la page de manuel pour comprendre comment l'utiliser.

Buisson
la source