¿Colorear su terminal y entorno de shell?

¿Colorear su terminal y entorno de shell?

Paso la mayor parte de mi tiempo trabajando en entornos Unix y usando emuladores de terminal. Intento usar color en la línea de comando, porque el color hace que la salida sea más útil e intuitiva.

¿Qué opciones existen para agregar color al entorno de mi terminal? ¿Qué trucos utilizas? ¿Qué obstáculos has encontrado?

Desafortunadamente, la compatibilidad con el color varía según el tipo de terminal, el sistema operativo, la configuración de TERM, la utilidad, las implementaciones de errores, etc.

Aquí hay algunos consejos de mi configuración, después de mucha experimentación:

  1. Tiendo a configurar TERM=xterm-color, que es compatible con la mayoría de los hosts (pero no en todos).
  2. Trabajo en varios hosts diferentes, diferentes versiones de sistemas operativos, etc. Utilizo de todo, desde macOS X, Ubuntu Linux, RHEL/CentOS/Scientific Linux y FreeBSD. Intento mantener las cosas simples y genéricas, si es posible.
  3. Trabajo mucho usando GNU screen, lo que añade otra capa de diversión.
  4. Muchos sistemas operativos configuran cosas como dircolorsy de forma predeterminada, y no quiero modificar esto en cien hosts diferentes. Así que trato de seguir con los valores predeterminados. En lugar de eso, modifico la configuración de color de mi terminal.
  5. Usa color para algunosComandos Unix( ls, grep, less, vim) y elmensaje de bash. Estos comandos parecen utilizar el estándar "Secuencias de escape ANSI". Por ejemplo:

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

Publicaré .bashrcmi propia pregunta y responderé a Jeopardy Style.

Respuesta1

Aquí hay un par de cosas que puedes hacer:

Editores + Código
Muchos editores admiten resaltado de sintaxis. vimy emacstenerlo activado de forma predeterminada. Tú también puedeshabilitarlo bajonano.

También puede resaltar la sintaxis del código en el terminal usandopigmentoscomo herramienta de línea de comandos.

grep
grep --color=autodestaca todos los partidos. También puedes usarlo export GREP_OPTIONS='--color=auto'para hacerlo persistente sin un alias. Si lo usas --color=always, seráuse color incluso cuando esté ribeteando, lo que confunde las cosas.

es

ls --color=always

Colores especificados por:

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

(pista: dircolorspuede ser útil)

PS1
Puedes configurar tu PS1 (indicador de shell) para que use colores. Por ejemplo:

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

Producirá una PS1 como:

[amarillo]lucas@ubuntu: [rojo]~[normal]$

Puedes ser realmente creativo con esto. Como idea:

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

Coloca una barra en la parte superior de tu terminal con información aleatoria. (Para obtener mejores resultados, utilice también alias clear="echo -e '\e[2J\n\n'").

Deshacerse de las secuencias de escape

Si algo se atasca generando color cuando no lo deseas, uso esta sedlínea para eliminar las secuencias de escape:

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

Si desea una experiencia más auténtica, también puede deshacerse de las líneas que comienzan con \e[8m, que indican al terminal que oculte el texto. (No es ampliamente compatible).

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

También tenga en cuenta que esos ^[s deben ser ^[s reales y literales. Puedes escribirlos presionando ^V^[ en bash, es decir Ctrl+ V, Ctrl+ [.

Respuesta2

Yo también uso:

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

Y si le gusta colorear su mensaje, las variaciones de color definidas pueden resultar útiles:

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'

Y luego mi mensaje es algo como esto:

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) está llamando a un script de Python en mi ~/sbin que imprime información de control de versión sobre la ruta actual. Incluye soporte para Mercurial, Git, Svn, Cvs, etc. El autor del script tiene lafuente aquí.

Captura de pantalla del mensaje Bash

Este es elfuente completade mi configuración de aviso:

Respuesta3

grepy lsya han sido mencionados, si quieres muchos más colores echa un vistazoColorante genérico, su propósito inicial era colorear los archivos de registro, pero desde el primer momento también colorea ping, traceroute, gcc, make, netstat, diff, last, ldapy cvs.

Se extiende fácilmente si conoces las expresiones regulares. Agregué psy nmapa la lista (si ingresa, grcestaré más que feliz de compartir los archivos .conf para esas dos herramientas)

(Por cierto, para instalarlo a través de synaptic, pacmany es posible que tengas más suerte buscando "grc")

Respuesta4

Colores parapaginas man(mas detalle):

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 -; }

Colores paragrep( 1;32es verde brillante, consulte otras publicaciones aquí para ver otros colores):

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'

Usar LC_ALL=Cfor fgrep puede proporcionar unaAumento de rendimiento 140 veces mayor

Más colores paraGNU 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

Instalargrc(Colorante genérico) y agréguelo a sus alias:

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

Colores paradiferencia: Demasiado contenido para una función, use un script y asígnele un alias en su archivo rc (innecesario si instaló 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;

Colores paramensaje de bash:

# 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

demostración del indicador bash

información relacionada