Les séquences d'échappement de couleur terminales sont-elles définies quelque part pour bash?

22

J'ai utilisé de temps en temps des couleurs dans les scripts Bash (principalement sur CentOS), mais pour rendre leur utilisation plus pratique, je finis par redéfinir les variables en valeurs de couleur:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

ou aussi avec tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

J'ai parcouru le /etc/rc.d/init.drépertoire mais je n'y ai rien trouvé concernant les définitions de couleurs.

Existe-t-il déjà une telle définition? Sinon, je les mettrais dans un fichier /etc/rc.d/init.d, disons, et je les inclurais dans mes scripts, un peu comme avec/etc/rc.d/init.d/functions

fduff
la source
Ils ne le sont pas, car \e[1;30m, par exemple, ne représentent pas techniquement le gris, mais plutôt la fente de couleur généralement affichée en gris par un terminal. Les émulateurs de terminal sont libres de modifier les couleurs d'affichage réelles et en font souvent une option configurable par l'utilisateur.
chepner

Réponses:

36

Il y a plusieurs aspects en jeu dans ce que vous demandez.

Tout d'abord, bash ne définit pas les couleurs. En fait, bash n'a absolument aucune idée que les couleurs existent. Tout ce qu'il sait, c'est que vous lui avez dit de sortir les caractères \033[0;36m. Votre émulateur de terminal (xterm, gnome-terminal, peu importe) reçoit ces caractères et comprend "J'ai besoin de commencer la sortie en cyan".

C'est donc votre émulateur de terminal qui comprend les couleurs. Votre émulateur de terminal comprend que \033[0;36mc'est cyan, mais un autre émulateur de terminal peut utiliser un jeu de caractères entièrement différent pour le cyan (bien qu'aucun émulateur de terminal sensé ne fasse étalage de la norme et ne le fasse). C'est la raison de cela tput. Lorsque vous exécutez tput setaf 6, tputva rechercher les codes d'échappement de votre terminal pour la couleur 6 (cyan) et sortir ce code d'échappement.
(voir cette question pour plus d'informations sur les tput setafcodes)

Revenons maintenant à bash. Comme vous l'avez peut-être remarqué, lorsque je me réfère à la couleur cyan, j'utilise \033[0;36m, non \[\033[0;36m\]. Les crochets manquaient. Le but des crochets est que lorsque vous utilisez des codes d'échappement (couleurs) dans l'invite, bash doit savoir quels caractères ne s'impriment pas (largeur nulle, n'affiche en fait rien). Ainsi, vous insérez des caractères non imprimables dans \[ \]. Si vous supprimez ces caractères, tout pourrait sembler fonctionner correctement au début, mais vous commencerez à rencontrer toutes sortes de bizarreries lorsque votre commande dépasse la largeur du terminal. En effet, lors de la frappe, bash doit savoir quand la commande doit passer à la ligne suivante. Pour ce faire, il calcule la largeur de l'invite, puis la largeur de la quantité que vous avez tapée.

Une autre note, à propos tput. CYAN="\[\033[0;36m\]"n'est pas la même chose que CYAN="$(tput setaf 6)". Comme nous venons de le voir, les crochets sont pertinents pour bash et tputne vont sortir que les codes d'échappement du terminal.

Étant donné que les crochets ne sont généralement pertinents que dans l'invite, si vous utilisez des couleurs dans la sortie d'un script ou quelque chose, vous ne devez pas les utiliser. Cela signifie que si vous allez utiliser des couleurs pour plus que des invites, vous devez définir plusieurs variables. Un avec des crochets pour une utilisation dans l'invite et un sans pour tout le reste. Bien que vous puissiez simplement ajouter manuellement les crochets à chaque fois que vous faites référence à une couleur dans l'invite.

Pour faire court, vous voudrez probablement définir quelque chose comme:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
Patrick
la source
Comment puis-je voir les couleurs lorsque je me connecte à un vrai terminal avec Ctrl+ Alt+ F1?
Serge Stroobandt