web-dev-qa-db-fra.com

Bash de séquence RVB spécifique à la couleur ANSI

Je sais que dans les terminaux bash, un moyen fiable de changer la couleur utilise les séquences d'échappement ANSI. Par exemple:

echo -e "\033[0;31mbrown text\033[0;00m"

devrait sortir

brown text (in brown)

Existe-t-il un moyen de produire des couleurs en utilisant un ensemble RVB spécifique avec ANSI? Dis que je veux du rouge vif:

echo -e "**\033[255:0:0m**red text\033[0;00m"

Ce genre de chose existe-t-il?

Je veux juste utiliser bash standard.

31
Blue Ice

Cela existe, mais au lieu des 16777216 (256 ^ 3) couleurs que l'OP recherchait, il y a 216 (6 ^ 3) couleurs également distribuées, dans un plus grand ensemble de 256 couleurs. Exemple:

echo -e "\033[38;5;208mpeach\033[0;00m"

Cela produira une sorte agréable de texte de couleur pêche.


Démontage de cette commande: \033 [38; 5; 208m

Le \033 est le code d'échappement. La commande [38; dirige la commande au premier plan . Si vous souhaitez modifier la couleur d'arrière-plan à la place, utilisez [48; à la place. Le 5; n'est qu'un morceau de la séquence qui change de couleur. Et la partie la plus importante, 208m , sélectionne la couleur réelle.


Il y a 3 jeux de couleurs qui peuvent être trouvés dans la séquence de 256 couleurs pour cette évasion. Le premier ensemble est l'ensemble de couleurs de base "bonbon", ou les valeurs 0-15. Ensuite, il y a un cube de couleurs distribuées, de 16 à 231. Enfin, il existe un ensemble de niveaux de gris détaillé de 232 à 255.

Vous pouvez trouver un tableau avec toutes ces valeurs ici: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your- Bash-Prompt-on-Linux # 256% 20 (8 bits)% 20Colors

44
Blue Ice

Les deux réponses ici ne mentionnent pas le Truecolorprise en charge ANSI pour la couleur 8bpc. Cela obtiendra la couleur RVB que l'OP demandait à l'origine.

Au lieu de ;5, Utilisez ;2, Et spécifiez le [~ # ~] r [~ # ~] , [~ # ~] g [~ # ~] , et [~ # ~] b [~ # ~ ] valeurs (0-255) dans les trois segments de contrôle suivants.

\x1b[38;2;40;177;249m

Pour tester si votre terminal prend en charge Truecolor :

printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"

Sur ma machine, XTerm a heureusement sorti la bonne couleur; bien que les terminaux modélisés d'après des terminaux antérieurs à la couleur RVB moderne ne prennent généralement pas en charge truecolor - assurez-vous de connaître votre cible avant d'utiliser cette variante particulière du code d'échappement.


Je voudrais également souligner les 38 Et les ;5/;2 - Blue Ice mentionné que 38 Itinéraires et alors 5 change la couleur. C'est un peu incorrect.

38 Est le code de couleur de premier plan étendu xterm-256; 30 - 37 Sont simplement des codes de premier plan à 16 couleurs (avec une luminosité contrôlée par le code d'échappement 1 Sur certains systèmes et le 90 - 97 Codes "standard" non standard) pris en charge par tous les terminaux colorés compatibles vt100/xterm.

;2 Et ;5 Indiquent le format de la couleur, indiquant au terminal le nombre de séquences à extraire: ;5 Spécifiant un format 8 bits (comme l'a mentionné Blue Ice) ne nécessitant qu'un segment de contrôle supplémentaire et ;2 spécifiant un format RVB 24 bits complet nécessitant 3 segments de contrôle.

Ces modes étendus sont techniquement "non documentés" et sont complètement définis par l'implémentation. Pour autant que je sache et que je puisse faire des recherches, ils ne sont pas régis par le comité ANSI.


Pour les personnes inclinées, le format 5; (256 couleurs) commence avec les 16 couleurs originales (à la fois foncées/claires, donc 30-37 et 90-97) en tant que couleurs 0-15.

Les 216 couleurs précédentes (16-231) sont formées par une valeur RVB de 3bpc décalée de 16, regroupées en une seule valeur.

Les 24 couleurs finales (232-256) sont des niveaux de gris à partir d'une teinte légèrement plus claire que le noir allant jusqu'à une teinte légèrement plus foncée que le blanc. Certains émulateurs interprètent ces étapes comme des incréments linéaires de (256 / 24) Sur les trois canaux, bien que j'aie rencontré des émulateurs qui semblent définir explicitement ces valeurs.

Voici une fonction Javascript qui effectue une telle conversion, en tenant compte de tous les gris.

function rgbToAnsi256(r, g, b) {
    // we use the extended greyscale palette here, with the exception of
    // black and white. normal palette only has 4 greyscale shades.
    if (r === g && g === b) {
        if (r < 8) {
            return 16;
        }

        if (r > 248) {
            return 231;
        }

        return Math.round(((r - 8) / 247) * 24) + 232;
    }

    var ansi = 16
        + (36 * Math.round(r / 255 * 5))
        + (6 * Math.round(g / 255 * 5))
        + Math.round(b / 255 * 5);

    return ansi;
}

Donc, d'une certaine manière, vous pouvez calculer 256 couleurs ANSI à partir des valeurs RVB initiales en les réduisant de 8 à 3 bits afin de former une valeur codée de 256 dans le cas où vous souhaitez le faire par programmation sur des terminaux qui ne prend pas en charge Truecolor.

59
Qix

Actuellement, les séquences d'échappement de couleurs vraies (\ e [38; 2; R; G; Bm) sont prises en charge par certains émulateurs terminaux, y compris gnome-terminal (avec vte> = 0,36), konsole et st [suckless].

La fonctionnalité est pas prise en charge par certains autres, par exemple pterm [PuTTY], terminologie [Lumières], urxvt.

xterm est à mi-chemin entre les deux: il reconnaît les séquences d'échappement, mais arrondit chaque couleur à la plus proche dans la palette de 256 couleurs.

2
egmont