it-swarm.com.de

tput setaf Farbtabelle? Wie bestimme ich Farbcodes?

Ich bin gerade dabei, den PS1 Meines Terminals einzufärben.

Ich setze Farbvariablen mit tput; Hier ist zum Beispiel lila:

PURPLE=$(tput setaf 125)

Frage:

Wie finde ich die Farbcodes (z. B. 125) Anderer Farben?

Gibt es irgendwo eine Farbtabellenanleitung/einen Spickzettel?

Ich bin mir nur nicht sicher, was 125 Ist. Gibt es eine Möglichkeit, eine Hex-Farbe zu nehmen und in eine Zahl umzuwandeln, die setaf verwenden kann?

90
mhulse

Die Anzahl der Farben, die für die Eingabe verfügbar sind, wird durch tput colors Angegeben.

So zeigen Sie die 8 Grundfarben an (wie sie von setf im urxvt-Terminal und setaf im xterm-Terminal verwendet werden):

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

Und normalerweise so genannt:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
Magenta   COLOR_Magenta     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

So zeigen Sie die erweiterten 256 Farben an (wie sie von setaf in urxvt verwendet werden):

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

Wenn Sie Zahlen und eine geordnete Ausgabe wünschen:

#!/bin/bash
color(){
    for c; do
        printf '\e[48;5;%dm%03d' $c $c
    done
    printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

256 color chart in sequence, labeled with their index


Die 16 Millionen Farben benötigen ziemlich viel Code (einige Konsolen können dies nicht anzeigen).
Die Grundlagen sind:

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fb ist front/back oder 3/4.

Ein einfacher Test Ihrer Konsolenkapazität, um so viele Farben zu präsentieren, ist:

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

red line, fading from darker to lighter (left-to-right) Es wird eine rote Linie mit einer sehr kleinen Änderung des Tons von links nach rechts angezeigt. Wenn diese kleine Änderung sichtbar ist, kann Ihre Konsole 16 Millionen Farben verwenden.

Jedes r, g und b ist ein Wert von 0 bis 255 für RGB (Rot, Grün, Blau).

Wenn Ihr Konsolentyp dies unterstützt, erstellt dieser Code eine Farbtabelle:

mode2header(){
    #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
    printf '\e[mR\n' # reset the colors.
    printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]] && fb=4
    local samples=(0 63 127 191 255)
    for         r in "${samples[@]}"; do
        for     g in "${samples[@]}"; do
            for b in "${samples[@]}"; do
                printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf '\e[m\n'
        done; printf '\e[m'
    done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

chart of sample foreground colors with their index as labels

chart of sample background colors with their index as labels

So konvertieren Sie einen Hex-Farbwert in einen (nächsten) 0-255-Farbindex:

fromhex(){
    hex=${1#"#"}
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' ${hex#??})
    b=$(printf '0x%0.2s' ${hex#????})
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"
}

Verwenden Sie es als:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

So finden Sie die Farbnummer, wie sie im HTML-Farbformat verwendet wird:

#!/bin/dash
tohex(){
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ]; then
        bas=$(( dec%16 ))
        mul=128
        [ "$bas" -eq "7" ] && mul=192
        [ "$bas" -eq "8" ] && bas=7
        [ "$bas" -gt "8" ] && mul=255
        a="$((  (bas&1)    *mul ))"
        b="$(( ((bas&2)>>1)*mul ))" 
        c="$(( ((bas&4)>>2)*mul ))"
        printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
    Elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
        b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
        g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
        r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
        printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
    else
        gray=$(( (dec-232)*10+8 ))
        printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
    fi
}

for i in $(seq 0 255); do
    tohex ${i}
done

Verwenden Sie es als ("Grund" ist die ersten 16 Farben, "Farbe" ist die Hauptgruppe, "Grau" ist die letzte graue Farbe):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626
169
user79743

Die kurze Antwort lautet, dass Sie in den Web-Tabellen Farbtabellen finden und diese mit der Farbnummer abgleichen können.

Die lange Antwort lautet, dass die richtige Zuordnung vom Terminal abhängt -

Das 125 ist ein Parameter für eine Escape-Sequenz, die in der Terminalbeschreibung als setaf bezeichnet wird. tput fügt der Nummer keine besondere Bedeutung hinzu. Das hängt tatsächlich vom jeweiligen Terminalemulator ab.

Vor einiger Zeit definierte ANSI Codes für 8 Farben, und es gab zwei Schemata, um diese zu nummerieren. Die beiden werden in einigen Terminalbeschreibungen als die Paare setf/setb oder setaf/setab. Da letzteres die Konnotation "ANSI-Farben" hat, werden Sie sehen, dass diese häufiger verwendet werden. Ersteres (setf/setb) hat die Reihenfolge für Rot/Blau geändert, wie in den ncurses angegeben FAQ Warum werden Rot/Blau vertauscht?, aber in beiden Fällen wurde das Schema nur für die Nummerierung der Farben festgelegt. Es gibt keine vordefinierte Beziehung zwischen diesen Zahlen und dem RGB-Inhalt.

Für bestimmte Terminalemulatoren gibt es vordefinierte Farbpaletten, die leicht genug aufgezählt werden können - und mit diesen Escape-Sequenzen programmiert werden können. Es gibt keine relevanten Standards, und Sie werden Unterschiede zwischen Terminalemulatoren sehen, wie in xterm FAQ Ich mag diesen Blauton nicht ​​.

Konventionen werden jedoch häufig mit Standards verwechselt. Bei der Entwicklung von xterm in den letzten 20 Jahren wurden ANSI (8) -Farben integriert, die Farben der aixterm -Funktion (16) angepasst und Erweiterungen für 88- und 256-Farben hinzugefügt. Ein Großteil davon wurde von anderen Entwicklern für verschiedene Terminalemulatoren übernommen. Das ist im xterm zusammengefasst FAQ Warum nicht "xterm" gleich "xterm-256color" machen?.

Der xterm-Quellcode enthält Skripte zum Demonstrieren der Farben, z. B. unter Verwendung derselben Escape-Sequenzen, die tput verwenden würden.

Diese Frage/Antwort kann auch hilfreich sein: RGB-Werte der Farben im erweiterten Ansi-Farbindex (17-255)

15
Thomas Dickey

Das Dienstprogramm tput verwendet eine 256-Farben-Nachschlagetabelle zum Drucken 8-Bit-ANSI-Escape-Sequenzen (beginnend mit Esc und [), das Terminalfunktionen verwendet, sodass diese Steuersequenzen als Farben interpretiert werden können. Hierbei handelt es sich um einen vordefinierten Satz von 256 Farben, die üblicherweise für Grafikkarten verwendet werden.

Versuchen Sie den folgenden Einzeiler, um alle 256 Farben im Terminal zu drucken:

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

Hinweis: Anhängen | column zur Spaltenliste.

Diese 256-Farben-Nachschlagetabelle finden Sie auch unter Wikipedia-Seite wie folgt:

(Chart; ANSI escape code; 8-bit 256-color lookup table at Wikipedia; 256-color mode — foreground: ESC[38;5;#m background: ESC[48;5;#m

11
kenorb

Mit zsh und in einem xterm-ähnlichen Terminal (xterm und vte-basierten Terminals wie gnome-terminal, xfce4-terminal... zumindest) können Sie tun:

$ read -s -t1 -d $'\a' $'c?\e]4;125;?\a' && echo "${c##*;}"
rgb:afaf/0000/5f5f

Das Bash-Äquivalent:

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"

(Sie möchten, dass die Escape-Sequenz die zu sendende Farbe abfragt nach Die Terminaldisziplin echo ist deaktiviert (mit -s) andernfalls würde die Antwort die Hälfte der Zeit von der Zeilendisziplin angezeigt, daher das Senden als Teil der Eingabeaufforderung read (var?prompt in zsh wie in ksh, -p Prompt in bash)).

um die Definition der Farbe 125 zu erhalten (hier als RGB-Spezifikation, wobei jede Zahl die Intensität der roten, grünen und blauen Komponenten als Hex-Zahl zwischen 0 und FFFF ist).

Sie können dasselbe für die ersten 16 Farben mit dem Befehl xtermcontrol tun:

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000
3

ANSI-Farben auf Konsolenbegriff

Präambel: über die Variable $TERM

Überprüfen Sie Ihre Umgebung mit: tput colors

Wenn Sie eine kompatible xterm Konsole verwenden, kann Ihre $TERM So etwas wie xterm* Enthalten:

echo $TERM
xterm

tput colors
8

Weitere Demos funktionieren nicht: Sie erhalten ein Bild wie folgt:

(enter image description here

es sei denn, Sie setzen dies auf xterm-256color:

export TERM=xterm-256color ; reset

tput colors
256

(Sie können sogar versuchen, dies auszuführen, nachdem Sie export TERM=xterm-mono Eingestellt haben;)

Erledige einfach die Arbeit mit tput

Je nachdem, welches Begriffsprotokoll Ihre Konsole verwendet, kann die Reihenfolge wie folgt lauten: \e[38;5;XXXm Oder \e[3XXXm, Wobei XXX der Ansi-Nummer entspricht.

Um sicherzustellen, dass Sie die richtige ANSI-Sequenz verwenden, müssen Sie tput verwenden.

In Bezug auf ANSI-Escape-Code von Wikipedia habe ich Folgendes geschrieben:

#!/bin/bash

for ((i=0; i<256; i++)) ;do
    echo -n '  '
    tput setab $i
    tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
        (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
    printf " C %03d " $i
    tput op
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

Könnte so etwas wie rendern:

(enter image description here

Optimieren bash : Reduzieren von Gabeln durch Ausführen einer Backgroung-Task

... Dann, weil ich es hasse, mehr als 200 Gabeln in einem kleinen Skript laufen zu lassen, schrieb ich Folgendes:

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_Shell_XXXXXXX)

fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}

tputConnector() {
    mkfifo $TMPDIR/tput
    nextFd TPUTIN
    eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
    nextFd TPUTOUT
    eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector

myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
    myTput "setab $i" bgr
    printf "  %s%s  %3d  %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
        (i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
        ? 1 : 0 ]}" $i "$op"
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

Mit nur 1 Gabel! Gleiches Ergebnis, aber ca. 10x schneller!

Wenn das erste Skript in ~ 1,12 Sekunden auf meinem Schreibtisch ausgeführt wird, dauert es auf meinem Himbeer-Pi bis zu ~ 47,4 Sekunden !!

Während das zweite Skript in ~ 0,11 Sekunden auf meinem Schreibtisch und ~ 4,97 Sekunden auf meiner Himbeere ausgeführt wird.

3
F. Hauri