Ihre Terminal- und Shell-Umgebung kolorieren?

Ihre Terminal- und Shell-Umgebung kolorieren?

Ich verbringe die meiste Zeit mit der Arbeit in Unix-Umgebungen und mit Terminalemulatoren. Ich versuche, Farbe in der Befehlszeile zu verwenden, da Farbe die Ausgabe nützlicher und intuitiver macht.

Welche Möglichkeiten gibt es, meiner Terminalumgebung Farbe zu verleihen? Welche Tricks verwenden Sie? Auf welche Fallstricke sind Sie gestoßen?

Leider variiert die Farbunterstützung je nach Terminaltyp, Betriebssystem, TERM-Einstellung, Dienstprogramm, fehlerhaften Implementierungen usw.

Hier sind einige Tipps aus meinem Setup, nach vielen Experimenten:

  1. Ich neige dazu, einzustellen TERM=xterm-color, was auf den meisten (aber nicht allen) Hosts unterstützt wird.
  2. Ich arbeite auf einer Reihe verschiedener Hosts, mit verschiedenen Betriebssystemversionen usw. Ich verwende alles von macOS X, Ubuntu Linux, RHEL/CentOS/Scientific Linux und FreeBSD. Ich versuche, die Dinge möglichst einfach und allgemein zu halten.
  3. Ich erledige einen Großteil meiner Arbeit mit GNU screen, was den Spaß noch weiter steigert.
  4. Viele Betriebssysteme legen dircolorsstandardmäßig Dinge wie und fest, und ich möchte dies nicht auf hundert verschiedenen Hosts ändern. Daher versuche ich, bei den Standardeinstellungen zu bleiben. Stattdessen optimiere ich die Farbkonfiguration meines Terminals.
  5. Verwenden Sie Farbe für einigeUnix-Befehle( ls, grep, less, vim) und dasBash-EingabeaufforderungDiese Befehle scheinen den Standard "ANSI-Escapesequenzen". Zum Beispiel:

    alias less='less --RAW-CONTROL-CHARS'
    export LS_OPTS='--color=auto'
    alias ls='ls ${LS_OPTS}'
    

Ich werde .bashrcmeine eigene Frage im Jeopardy-Stil posten und beantworten.

Antwort1

Sie können Folgendes tun:

Editoren + Code
Viele Editoren unterstützen die Syntaxhervorhebung vimund emacshaben sie standardmäßig aktiviert. Sie können auchaktivieren Sie es unternano.

Sie können die Syntax des Codes auf dem Terminal auch hervorheben, indem SiePygmenteals Befehlszeilentool.

grep
grep --color=autohebt alle Übereinstimmungen hervor. Sie können auch verwenden, export GREP_OPTIONS='--color=auto'um es dauerhaft ohne Alias ​​zu machen. Wenn Sie verwenden --color=always, wird esauch beim Verrohren Farbe verwenden, was die Sache verwirrend macht.

ls

ls --color=always

Farben angegeben durch:

export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33'

(Hinweis: dircolorskann hilfreich sein)

PS1
Sie können Ihre PS1 (Shell-Eingabeaufforderung) so einstellen, dass sie Farben verwendet. Beispiel:

PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '

Erzeugt eine PS1 wie:

[gelb]lucas@ubuntu: [rot]~[normal]$

Sie können dabei wirklich kreativ werden. Als Idee:

PS1='\e[s\e[0;0H\e[1;33m\h    \t\n\e[1;32mThis is my computer\e[u[\u@\h:  \w]\$ '

Fügt oben in Ihrem Terminal eine Leiste mit einigen zufälligen Informationen ein. (Für beste Ergebnisse verwenden Sie auch alias clear="echo -e '\e[2J\n\n'".)

Escape-Sequenzen loswerden

Wenn etwas bei der Farbausgabe hängen bleibt, obwohl Sie das nicht möchten, verwende ich diese sedZeile, um die Escape-Sequenzen zu entfernen:

sed "s/\[^[[0-9;]*[a-zA-Z]//gi"

Wenn Sie ein authentischeres Erlebnis wünschen, können Sie auch Zeilen entfernen \e[8m, die mit beginnen. Dadurch wird das Terminal angewiesen, den Text auszublenden. (Wird nicht überall unterstützt.)

sed "s/^\[^[8m.*$//gi"

Beachten Sie auch, dass diese ^[s tatsächliche, wörtliche ^[s sein sollten. Sie können sie eingeben, indem Sie in Bash ^V^[ drücken, also Ctrl+ V, Ctrl+ [.

Antwort2

Ich benutze außerdem:

export TERM=xterm-color
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

Und wenn Sie Ihre Eingabeaufforderung einfärben möchten, können definierte Farbvariablen nützlich sein:

export COLOR_NC='\e[0m' # No Color
export COLOR_BLACK='\e[0;30m'
export COLOR_GRAY='\e[1;30m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_LIGHT_GRAY='\e[0;37m'
export COLOR_WHITE='\e[1;37m'

Und dann ist meine Eingabeaufforderung ungefähr so:

case $TERM in
     xterm*|rxvt*)
         local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
          ;;
     *)
         local TITLEBAR=""
          ;;
    esac

local UC=$COLOR_WHITE               # user's color
[ $UID -eq "0" ] && UC=$COLOR_RED   # root's color

PS1="$TITLEBAR\n\[${UC}\]\u \[${COLOR_LIGHT_BLUE}\]\${PWD} \[${COLOR_BLACK}\]\$(vcprompt) \n\[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "  

$(vcprompt) ruft ein Python-Skript in meinem ~/sbin auf, das Versionskontrollinformationen über den aktuellen Pfad ausgibt. Es enthält Unterstützung für Mercurial, Git, Svn, Cvs usw. Der Autor des Skripts hat dieQuelle hier.

Screenshot der Bash-Eingabeaufforderung

Dies ist dasvollständige Quellemeiner Prompt-Konfiguration:

Antwort3

grepund lswurden bereits erwähnt, wenn Sie viel mehr Farben wollen, schauen Sie sichGenerischer Kolorizer, sein ursprünglicher Zweck bestand darin, Protokolldateien einzufärben, aber direkt nach dem Auspacken färbt es auch ping, traceroute, gcc, make, netstat, , diff, last, ldap, und ein cvs.

Es lässt sich leicht erweitern, wenn Sie Regexes kennen. Ich habe psund nmapzur Liste hinzugefügt (wenn Sie sich damit befassen, grcteile ich Ihnen gerne die .conf-Dateien für diese beiden Tools mit).

(Übrigens: Um es über synaptic, pacman, und ähnliche zu installieren, haben Sie möglicherweise mehr Erfolg, wenn Sie nach „grc“ suchen.)

Antwort4

Farben fürman-Seiten(Mehr Details):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$'\e[1;35m' \
    LESS_TERMCAP_md=$'\e[1;34m' \
    LESS_TERMCAP_me=$'\e[0m' \
    LESS_TERMCAP_se=$'\e[0m' \
    LESS_TERMCAP_so=$'\e[7;40m' \
    LESS_TERMCAP_ue=$'\e[0m' \
    LESS_TERMCAP_us=$'\e[1;33m' \
    LESS_TERMCAP_mr=$(tput rev) \
    LESS_TERMCAP_mh=$(tput dim) \
    LESS_TERMCAP_ZN=$(tput ssubm) \
    LESS_TERMCAP_ZV=$(tput rsubm) \
    LESS_TERMCAP_ZO=$(tput ssupm) \
    LESS_TERMCAP_ZW=$(tput rsupm) \
    GROFF_NO_SGR=1 \
      "$@"
}
alias man="LANG=C _colorman man"
function perldoc() { command perldoc -n less "$@" |man -l -; }

Farben fürgrep( 1;32ist hellgrün, andere Farben finden Sie in den anderen Beiträgen hier):

GREP_OPTS='--color=auto'      # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32'             # (legacy) bright green rather than default red
# (new) Matching text in Selected line = green, line numbers dark yellow
GREP_COLORS="ms=${GREP_COLOR}:mc=${GREP_COLOR}:ln=33"
alias grep='grep $GREP_OPTS'
alias egrep='grep -E $GREP_OPTS'
alias fgrep='LC_ALL=C grep -F $GREP_OPTS'

Die Verwendung LC_ALL=Cvon fgrep kann eine140-fache Leistungssteigerung

Weitere Farben fürGNU ls:

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(find ~/.dircolors -size +0 2>/dev/null) )"

# Usage: _ls_colors_add BASE NEW [NEW...]
# Have LS color given NEW extensions the way BASE extension is colored
_ls_colors_add() {
  local BASE_COLOR="${LS_COLORS##*:?.$1=}" NEW
  if [ "$LS_COLORS" != "$BASE_COLOR" ]; then
    BASE_COLOR="${BASE_COLOR%%:*}"
    shift
    for NEW in "$@"; do
      if [ "$LS_COLORS" = "${LS_COLORS#*.$NEW=}" ]; then
        LS_COLORS="${LS_COLORS%%:}:*.$NEW=$BASE_COLOR:"
      fi
    done
  fi
  export LS_COLORS
}

_ls_colors_add zip jar xpi            # archives
_ls_colors_add jpg ico JPG PNG webp   # images
_ls_colors_add ogg opus               # audio (opus now included by default)

export CLICOLOR=1   # BSD auto-color trigger (like  ls -G  but for everything)
if ls -ld --color=auto / >/dev/null 2>&1
  then alias ls="ls -ph --color=auto"
  else alias ls="ls -ph"
fi

Installierengrc(Generischer Farbstoff) und fügen Sie es zu Ihren Aliasnamen hinzu:

if type grc grcat >/dev/null 2>&1; then
  colourify() {  # using this as a function allows easier calling down lower
    if [[ -t 1 || -n "$CLICOLOR_FORCE" ]]
      then ${GRC:-grc} -es --colour=auto "$@"
      else "$@"
    fi
  }

  # loop through known commands plus all those with named conf files
  for cmd in g++ head ld ping6 tail traceroute6 `locate grc/conf.`; do
    cmd="${cmd##*grc/conf.}"  # we want just the command
    type "$cmd" >/dev/null 2>&1 && alias "$cmd"="colourify $cmd"
  done

  # This needs run-time detection. We even fake the 'command not found' error.
  configure() {
    if [[ -x ./configure ]]; then
      colourify ./configure "$@"
    else
      echo "configure: command not found" >&2
      return 127
    fi
  }

  unalias ll 2>/dev/null
  ll() {
    if [[ -n "$CLICOLOR_FORCE" || -t 1 ]]; then  # re-implement --color=auto
      ls -l --color=always "$@" |grcat conf.ls
      return ${PIPESTATUS[0]} ${pipestatus[1]} # exit code of ls via bash or zsh
    fi
    ls -l "$@"
  }
fi

Farben fürUnterschied: Zu viel Inhalt für eine Funktion. Verwenden Sie ein Skript und benennen Sie es in Ihrer RC-Datei (unnötig, wenn Sie Folgendes installiert haben grc):

#!/usr/bin/perl
use strict;
use warnings;

open (DIFF, "-|", "diff", @ARGV) or die $!;

my $ydiff = 1;
while (<DIFF>) {
  if (not -t 1) {
    print;
    next;
  }
  chomp;
  $ydiff = 0 if /^[ <>\@+-]/ or ($. == 1 && /^\d+[a-z]{1,5}\d+$/);
  my $color = "";
  if (! $ydiff && /^[\@+-<>]/) {
    $color = (/^[<-](?!--$)/ ? 1 : /^[+>]/ ? 2 : 5);
  } elsif ($ydiff && /\t {6}([<|>])(?:\t|$)/) {
    $color = ($1 eq "<" ? 1 : $1 eq ">" ? 2 : 4);
  }
  $color ? printf ("\e[1;3%dm%s\e[0;0m\n",$color,$_) : print "$_\n";
}
close DIFF;

Farben fürBash-Eingabeaufforderung:

# Shorten home dir, Cygwin drives, paths that are too long
function PSWD() {
  local p="$*" space A B cols="${COLUMNS:-`tput cols 2>/dev/null || echo 80`}"
  p="${p/$HOME/\~}"         # shrink home down to a tilde
  if [ -d /cygdrive ] && [ "${p#/cygdrive/?/}" != "$p" ]; then
    p="${p:10:1}:${p:11}"   # /cygdrive/c/hi -> c:/hi
  fi
  space="$((${#USER}+${#HOSTNAME}+6))"  # width w/out the path
  if [ "$cols" -lt 60 ]; then echo -n "$N "; space=-29; p="$p$N\b"; fi
  if [ "$cols" -lt "$((space+${#p}+20))" ]; then # < 20 chars for the command
    A=$(( (cols-20-space)/4 ))      # a quarter of the space (-20 for cmd)
    if [ $A -lt 4 ]; then A=4; fi   # 4+ chars from beginning
    B=$(( cols-20-space-A*2 ))      # half (plus rounding) of the space
    if [ $B -lt 8 ]; then B=8; fi   # 8+ chars from end
    p="${p:0:$A}..${p: -$B}"
  fi
  echo "$p"
}

PSC() { printf $'\[\e[%sm\]' "${*:-0;0}"; }
PR="0;32"       # default color used in prompt is green
if [ "$(id -u)" = 0 ]; then
    sudo=41     # root is red background
  elif [ "$USER" != "${SUDO_USER:-$USER}" ]; then
    sudo=31     # not root, not self: red text
  else sudo="$PR"   # standard user color
fi
PROMPT_COMMAND='[ $? = 0 ] && PS1=${PS1[1]} || PS1=${PS1[2]}'
PSbase="$(PSC $sudo)\u$(PSC $PR)@\h $(PSC 33)\$(PSWD \w)"
PS1[1]="$PSbase$(PSC $PR)\$ $(PSC)"
PS1[2]="$PSbase$(PSC  31)\$ $(PSC)"
PS1="${PS1[1]}"
unset sudo PR PSbase

Demo der Bash-Eingabeaufforderung

verwandte Informationen