Colorindo seu ambiente de terminal e shell?

262

Passo a maior parte do tempo trabalhando em ambientes Unix e usando emuladores de terminal. Eu tento usar cores na linha de comando, porque as cores tornam a saída mais útil e intuitiva.

Quais opções existem para adicionar cor ao meu ambiente de terminal? Que truques você usa? Que armadilhas você encontrou?

Infelizmente, o suporte para cores varia dependendo do tipo de terminal, sistema operacional, configuração TERM, utilidade, implementações de bugs, etc.

Aqui estão algumas dicas da minha configuração, depois de muita experimentação:

  1. Costumo definir TERM=xterm-color, que é suportado na maioria dos hosts (mas não em todos).
  2. Trabalho em vários hosts diferentes, diferentes versões de SO, etc. Uso tudo, desde macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux e FreeBSD. Estou tentando manter as coisas simples e genéricas, se possível.
  3. Eu faço um monte de trabalho usando o GNU screen, o que adiciona outra camada de diversão.
  4. Muitos sistemas operacionais definem coisas como dircolorse por padrão, e não quero modificar isso em centenas de hosts diferentes. Então, eu tento manter os padrões. Em vez disso, ajusto a configuração de cores do meu terminal.
  5. Use cores para alguns comandos Unix ( ls, grep, less, vim) eo prompt do bash . Esses comandos parecem usar as " sequências de escape ANSI " padrão . Por exemplo:

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

Vou postar minha .bashrce responder minha própria pergunta Jeopardy Style.

Stefan Lasiewski
fonte
fyi minha abordagem (veja a resposta abaixo) aborda questões com as diferenças OSX e Linux, por exemplo cor em um é ls -G e no outro é ls --color-auto
Michael Durrant
1
Alguém viu uma ferramenta para colorir colunas? Isso é um column -t --color?
Tomáš Pospíšek

Respostas:

121

Aqui estão algumas coisas que você pode fazer:

Editores + Código
Muitos editores têm suporte a destaque de sintaxe. vime emacstê-lo ativado por padrão. Você também pode habilitá-lo emnano .

Você também pode sintonizar o código de destaque no terminal usando Pygments como uma ferramenta de linha de comando.

grep
grep --color=auto destaca todos os jogos. Você também pode usar export GREP_OPTIONS='--color=auto'para torná-lo persistente sem um alias. Se você usar --color=always, ele usará cores mesmo quando estiver em tubulação , o que confunde as coisas.

ls

ls --color=always

Cores especificadas por:

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

(dica: dircolorspode ser útil)

PS1
Você pode definir seu PS1 (prompt de shell) para usar cores. Por exemplo:

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

Produzirá um PS1 como:

lucas @ ubuntu: [vermelho] ~ [normal] $

Você pode ser realmente criativo com isso. Como uma ideia:

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

Coloca uma barra na parte superior do seu terminal com algumas informações aleatórias. (Para obter melhores resultados, use também alias clear="echo -e '\e[2J\n\n'".)

Livrar-se das seqüências de escape

Se algo está travando na saída de cores quando você não deseja, eu uso esta sedlinha para remover as seqüências de escape:

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

Se você deseja uma experiência mais autêntica, também pode se livrar das linhas que começam com \e[8m, o que instrui o terminal a ocultar o texto. (Não é amplamente suportado.)

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

Observe também que esses ^ [s devem ser reais, literais ^ [s. Pode introduzi-los pressionando ^ V ^ [em bash, que é Ctrl+ V, Ctrl+ [.

Lucas Jones
fonte
1
A primeira linha PS1 deve ler da seguinte forma: PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '. Existe um x supérfluo após a quarta barra invertida.
Chris
3
Escapes devem ser colocados dentro \[...\]ou os comandos na segunda linha sobrescreverão a primeira linha. PS1 = '[\ e [33; 1m] \ u @ \ h: [\ e [31m] \ W \ e [0m \ $'
yanglifu90
O ls --color=alwaysnão funciona. A abordagem de @ Michael Durrant é melhor para isso:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.
83

Eu também uso:

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

E se você gosta de colorir seu prompt, os vars de cores definidos podem ser úteis:

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

E então meu prompt é algo como isto:

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á chamando um script python no meu ~ / sbin que imprime informações de controle de versão sobre o caminho atual. Inclui suporte para Mercurial, Git, Svn, Cvs, etc. O autor do script tem a fonte aqui .

Captura de tela do prompt do Bash

Esta é a fonte completa da minha configuração de prompt:

Kris
fonte
Veja aqui para a solução de um problema na linha que eu tenho quando eu usei o PS1 acima: stackoverflow.com/questions/5087036/...
Xander Dunn
Atualizei a resposta para refletir os colchetes vazios das cores no prompt. Obrigado!
Kris
1
$LSCOLORSe $CLICOLORsão para BSD ls. O GNU ls (Linux) usa $LS_COLORScom uma sintaxe diferente. Como o GNU se sente em casa, eu LSCOLORS=exgxfxDacxBaBaCaCaeaEacostumo imitar as cores do GNU no BSD.
Adam Katz
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Steven Almeroth
1
Pode ser necessário gerar o .bashrcarquivo para que a modificação seja efetiva. Você pode fazer isso com o seguinte comando. source /path/to/.bashrc
François
18

grepe lsjá foram mencionados, se você quiser muito mais cores confira Coloriser genérico , o seu objectivo inicial era para colorir os arquivos de log, mas a direita fora da caixa também tenta colorir ping, traceroute, gcc, make, netstat, diff, last, ldap, e cvs.

É facilmente estendido se você conhece expressões regulares. Adicionei pse nmapà lista (se você entrar grc, ficarei feliz em compartilhar os arquivos .conf dessas duas ferramentas)

(Btw, para instalá-lo via synaptic, pacmane, da mesma forma que você pode ter melhor sorte em busca de "grc")

Sygo
fonte
grcagora suporta pspor padrão. Eu estaria interessado em seus nmapcorantes. Veja também minha resposta para criar um alias de todos eles de uma maneira que absorverá novos comandos quando você atualizar o grc.
Adam Katz
Eu percebi isso. aqui está o meu conf.nmap (e tudo o mais, na verdade) gist.github.com/sygo/844982#file-conf-nmap - notei que você trabalha no infosec, você pode achar conf.hexdump interessante, ainda não o terminei Apesar.
Sygo
Obrigado @Sygo. Eu bifurquei e revisei sua essência. Na verdade, eu nunca cometi dados com o git (sem falar nas gists do github) e não consigo descobrir como propor mesclá-los de volta para você (acho que é porque as gists são muito simplificadas).
Adam Katz
Eu suspeito que você não pode, porque é uma essência e não um repositório adequado. Eu verifiquei o seu garfo e definitivamente estou dando uma chance à sua versão. Estou curioso o que isso hexadecimal um vai se transformar em ...
Sygo
11

Eu aprimorei meu .bashrc ao longo dos anos para trabalhar no OSX e no Ubuntu.
Também reduzi o tamanho para 28 linhas com instruções de condição compactas.
Com isso, meu prompt do PS1 se parece com: insira a descrição da imagem aqui

com tempo em vermelho, nome de usuário em verde, nome da máquina em azul claro, pwd em azul mais escuro e ramo git em amarelo.

Recurso do meu prompt do PS1:

  • mostra ramo git!
  • caminhos de diretório longos (mais de 6 elementos) são 'aparados' para mostrar os 3 primeiros e os 3 últimos diretórios _entre eles (essa é a pwd sedparte de LOCATION).
  • retorno de carro no final para que o prompt esteja sempre à esquerda!

As linhas relevantes do meu .bashrcarquivo são:

git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'

Para sl com cores quando disponíveis e sem erros quando não (por exemplo, OSX):

ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Michael Durrant
fonte
1
As cores estão disponíveis lsno OS X, mas são feitas usando export CLICOLOR=1.
Thomasw
3
@ ThomasW, mas não no linux :-p O cara usa os dois.
Jimmy Kane
1
No entanto, ThomasW está correto ao apontar que a resposta é incorreta ao dizer que as cores não estão disponíveis lsno MacOS 10. A resposta também é errônea, pois as seqüências de caracteres aqui são de fato defeituosas. Eles não equilibrar corretamente \[e\] , e tem causado problemas para pelo menos uma pessoa copiar esta resposta .
JdeBP
9

Cores para páginas de manual ( mais detalhes ):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$(printf "\e[1;35m") \
    LESS_TERMCAP_md=$(printf "\e[1;34m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[7;40m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;33m") \
      "$@"
}
function man() { _colorman man "$@"; }
function perldoc() { command perldoc -n less "$@" |man -l -; }

Cores para grep ( 1;32é verde brilhante, veja outras postagens aqui para outras cores):

GREP_OPTS='--color=auto'      # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32'             # (legacy) bright green rather than default red
GREP_COLORS="ms=$GREP_COLOR"  # (new) Matching text in Selected line = green
alias   grep='grep $GREP_OPTS'
alias egrep='egrep $GREP_OPTS'
alias fgrep='fgrep $GREP_OPTS'

Mais cores para o GNU ls :

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(ls -d ~/.dircolors 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)

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

Instale grc( Colouriser genérico ) e adicione-o aos seus aliases:

# using this as a variable allows easier calling down lower
export GRC='grc -es --colour=auto'

# 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
  # if the command exists, alias it to pass through grc
  type "$cmd" >/dev/null 2>&1 && alias "$cmd"="$GRC $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
}

# GRC plus LS awesomeness (assumes you have an alias for ls)
unalias ll 2>/dev/null
if ls -ld --color=always / >/dev/null 2>&1; then GNU_LS="--color=always"; fi

ll() {
  if [[ -t 1 ]] || [[ -n "$CLICOLOR_FORCE" ]]
    then colourify ls -l $GNU_LS "$@"
    else ls -l "$@"
  fi
}

Cores para diff : muito conteúdo para uma função, use um script e o alias no seu arquivo rc (desnecessário se você instalou 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;

Cores para o prompt do bash :

# Shorten home dir, cygwin drives, paths that are too long
if [ -d /cygdrive ] && uname -a |grep -qi cygwin; then CYGWIN_OS=1; fi
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 [ -n "$CYGWIN_OS" ] && [ "${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() { echo -ne "\[\033[${1:-0;38}m\]"; }
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

demonstração do prompt do bash

Adam Katz
fonte
1
Voto positivo para uma captura de tela
Green
Minha PSWD()função costumava ser compatível com POSIX, mas é muito mais fácil facilitada usando o manuseio de substring bash / zsh. Consulte a revisão 6 para a versão POSIX, que envolve muitos pontos de interrogação e não era adaptável à largura do terminal. Não atualizei a captura de tela, mas é apenas uma pequena alteração na largura de 80 caracteres.
Adam Katz
CLICOLOR=1não funciona para mim com o FreeBSD 11.2
Simon C.
1
@SimonC. - Você pode estar usando utilitários GNU no seu sistema FreeBSD em vez dos BSD. CLICOLOR=1 lsdeve fazer o mesmo que ls -Gusar BSD ( ls -gem BSDs mais antigos). Se ls --colorfuncionar (sem erro), você está usando o lscomando do GNU e $CLICOLORé ignorado.
Adam Katz
1
@SimonC. - Você precisa realmente carregar o seu ~/.bashrcpara que quaisquer alterações tenham efeito. Execute source ~/.bashrcou inicie uma nova sessão do bash (inicie um terminal ou execute bash).
Adam Katz
8

Defina um prompt em negrito / colorido. Do cyberciti.biz e do BashFAQ

# 'tput bold' will work regardless of the foreground and background colors.
# Place the tput output into variables, so they are only execd once.
bold=$(tput bold) # This could also be a color.
reset=$(tput sgr0)
export PS1="\u@\[$bold\]\h\[$reset\]:\w \$ "

Também consegui encontrar configurações de cores que são amplamente suportadas e que não imprimem caracteres desagradáveis ​​em ambientes mais antigos (até mesmo no FreeBSD4!), E parecem funcionar bem se TERM = vt100, xterm, xterm-color. (Em geral). Do meu .bashrc:

# Set some options, based on the OS
OS=`uname -s` 

case "$OS" in
    "SunOS" ) 
        # Solaris ls doesn't allow color, so use special characters
        LS_OPTS='-F'
        alias  ls='ls ${LS_OPTS}'
        ;;
    "Linux" )
        # GNU ls supports colors!
        # See dircolors to customize colors
        export LS_OPTS='--color=auto' 
        alias  ls='ls ${LS_OPTS}'

        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"

        ;;
    "Darwin"|"FreeBSD")

        # Most FreeBSD & Apple Darwin supports colors
        export CLICOLOR=true
        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"
        ;;
    * ) 
        echo "Unknown OS [$OS]"
        ;;
esac
Stefan Lasiewski
fonte
1
Ou, se você quiser usar o ZSH, o prompt de Phil Gold em aperiodic.net/phil/prompt é uma obra de arte.
tsvallender
5

Coisas que ainda não foram ditas aqui:

Para colorir a saída de suas compilações com o gcc, há o colorgcc de Johannes Schlüter

Para colorir logs, há multitail

Para colorir qualquer stdout, montei xcol

exemplo xcol

Eu pessoalmente os uso da ferramenta xcol.

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

Eu uso essas variáveis ​​nos meus scripts assim

echo "${red}hello ${yellow}this is ${green}coloured${normal}"

Também gosto desta pequena função coloredEcho (encontrada no Stack Overflow)

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

coloredEcho "This text is green" green

Desculpe, não é permitido postar mais links

nachoparker
fonte
2
Olá, como você faz as sinalizações, para o caminho do prompt? Eu estou mencionando as barras retangulares com triângulo termina Graças
Artur Vieira
ele funciona em um terminal ubuntu gnu também?
helle
INAV também é uma ótima ferramenta para mostrar arquivos de log coloridos
Cyril Chaboisseau
4

Eu sugiro que você verifique o ZSH e seu plugin oh-my-zsh, que possui um dos recursos mais poderosos do console que eu vi. Um deles é escolher o tema para o seu terminal. Este é um exemplo do meu tema ... Em tty, as cores não são tão quentes, mas são as mesmas da foto ... De qualquer maneira, você vai adorar!

insira a descrição da imagem aqui


fonte
2
Se eu pudesse, diminuiria isso para a sugestão Oh-My-ZSH. Como engenheiro de sistemas que trabalha extensivamente no Terminal e como alguém que tentou adotar o zsh / oh-my-zsh no meu fluxo de trabalho, posso dizer honestamente que nunca recomendaria o ZSH a ninguém. Claro, você pode vincular o zsh a um arquivo com o nome de qualquer outro shell e emular esse shell, mas quando você faz isso, ele não lê o seu .bashrc, .bash_profile, etc. Além disso, você não pode colocar emulate bashno. arquivos. Para quem trabalha com recursos avançados no BASH, existem muitas sutilezas que o morderão. BASH é um sh melhor.
Charles Addis
2
A única coisa que o ZSH tem de imediato melhor que o BASH é a conclusão do comando, mas mesmo isso é programável no BASH. Talvez alguém que não use o shell, exceto para tarefas mundanas ocasionais, deva adotar o ZSH, mas não é para quem precisa usar o shell extensivamente. o =~operador pode morder você, a maneira como o ZSH lida com matrizes pode morder você, etc. Depois de usar o ZSH / Oh-My-ZSH por cerca de 9 meses, eu já tive o suficiente. Eu estava usando um tema personalizado que eu mesmo escrevi, o enviei para o BASH e escrevi minha própria linha de prompt do git e nunca mais olhei para trás. Agora já não se preocupar com a portabilidade
Charles Addis
1
"ele tem um dos recursos mais poderosos do console que eu vi. Um deles é escolher o tema para o seu terminal."
Jonathan Hartley
@ JonathanHartley, seu comentário parece que você o deixou incompleto. ?
Curinga
2
Obrigado pela sua preocupação, mas meu comentário diz tudo o que eu pretendia dizer.
Jonathan Hartley
4

Para visualizar a saída diferencial em cores, use colordiff .

sudo apt-get install colordiff

Canalize qualquer saída no formato diff para o colordiff:

saída do diff canalizado para o colordiff

Isso inclui alguns dos formatos alternativos do diff, como -y(lado a lado).

Como alternativa, se invocado de forma independente (sem nada canalizado), ele atua como um invólucro em torno de 'diff' e colore a saída. Portanto, eu tenho isso no meu .bashrc, também conhecido como 'diff' para colordiff.

# if colordiff is installed, use it
if type colordiff &>/dev/null ; then
    alias diff=colordiff
Jonathan Hartley
fonte
1
O .bashrcexemplo está ausente no final fie pode ser convertido em um comando de linha única:type colordiff &> /dev/null && alias diff='colordiff'
Teemu Leisti
3

Alguma decoração de texto (negrito) para diferenciar facilmente entre shell raiz e não raiz. Para Zsh:

if test $UID = 0
    then PS1="%B${PS1}%b "
fi

Para Bash:

if test $UID = 0
    then PS1="\033[1m${PS1}\033[0m"
fi
Mischa Arefiev
fonte
Por favor, especifique seu shell. A única tag específica do shell da pergunta é bash , mas eu sinto que seu código não é bash.
manatwork
@ manatwork: desculpe, esqueci de mencionar que era o Zsh. Atualizei minha postagem.
precisa saber é o seguinte
3

Eu apenas me perguntei a mesma coisa. Eu tenho minha própria abordagem, mas estou procurando alternativas.

Eu escrevo wrappers bash em torno de chamadas de programa e canalizo sua saída embora sed. O que eu gosto sedé que ele modificará e ecoará cada linha imediatamente => sem muito buffer. No entanto, não gosto que, para cada chamada para um programa agrupado, o sedcódigo seja analisado e compilado.

Por exemplo, é isso que faço para colorir a saída de ip:

#
# Colorcodes
#
NORMAL=`echo -e '\033[0m'`
RED=`echo -e '\033[31m'`
GREEN=`echo -e '\033[0;32m'`
LGREEN=`echo -e '\033[1;32m'`
BLUE=`echo -e '\033[0;34m'`
LBLUE=`echo -e '\033[1;34m'`
YELLOW=`echo -e '\033[0;33m'`


#
# command: ip
# highlight ip addresses, default route and interface names
#

IP4=$GREEN
IP6=$LBLUE
IFACE=${YELLOW}
DEFAULT_ROUTE=$LBLUE

IP_CMD=$(which ip)

function colored_ip()
{
${IP_CMD} $@ | sed \
    -e "s/inet [^ ]\+ /${IP4}&${NORMAL}/g"\
    -e "s/inet6 [^ ]\+ /${IP6}&${NORMAL}/g"\
    -e "s/^default via .*$/${DEFAULT_ROUTE}&${NORMAL}/"\
    -e "s/^\([0-9]\+: \+\)\([^ \t]\+\)/\1${IFACE}\2${NORMAL}/"
}

alias ip='colored_ip'
Bananguin
fonte
3

Para definir o prompt, eu tenho isso no meu arquivo .bashrc.

#Set variables for foreground colors
fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
#Set variables for background colors
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
#Set variables for font weight and text decoration
B=$(tput bold) ; U=$(tput smul) ; C=$(tput sgr0)
#NOTE: ${C} clears the current formatting

if [[ $USER = "root" ]]; then
  PS1="${B}${fgRed}\u${C}@\h(\s): ${fgGreen}\w${C} > "
else
  PS1="${B}${fgCyan}\u${C}@\h(\s): ${fgGreen}\w${C} > "
fi

Isso me dá um prompt que se parece com isso:

user@host(bash): ~/bin >

O diretório de trabalho está em verde. E o nome do usuário está em negrito e ciano, a menos que eu tenha executado o shell sudo; nesse caso, o nome do usuário ("root") exibe negrito e vermelho.

Pessoalmente, gosto muito de ter os caracteres de controle de formatação armazenados em variáveis, pois facilita a leitura do código para definir o prompt. Ele também faz a edição do prompt de muito mais fácil.

O motivo pelo qual uso tputé que ele deve ser mais universalmente suportado do que as 033[01;31m\]sequências estranhas . Além disso, como um bônus adicional, se você fizer isso echo $PS1no prompt, verá o prompt bruto com cores em vez daquelas seqüências de controle ininteligíveis.

Sildoreth
fonte
2

Você pode tentar um projeto que também ajude a colorir os scripts de saída, chamado ScriptEchoColor no source forge: http://scriptechocolor.sourceforge.net/

ex.:

echoc "@{lr}text output in light red"
echoc "@{bLGu}text outpus in blue, light green background and underlined"
echoc "you @{lr} can @{bLGu} mix @{-a} it all too"
echoc -x "ls" #executes ls command and colorizes it automatically to be easy to be seen

As cores automáticas são configuráveis.

Este é um exemplo feito com ele: insira a descrição da imagem aqui

Aquarius Power
fonte
2

Uma ótima ferramenta Python de uso geral para colorir a saída de comandos é ' colout '

Você fornece um regex com N grupos, seguido por uma lista separada por vírgulas de N cores. Qualquer texto que corresponda a um grupo será exibido na cor correspondente.

Então, por exemplo, se você estiver vendo alguma saída de teste:

python -m unittest discover -v

Saída sem cores de alguns unittests do Python

então você pode enfeitar com:

python -m unittest discover -v 2>&1 | colout '(.*ERROR$)|(.*FAIL$)|(\(.*\))' red,yellow,black bold

Saída colorida de alguns unittests do Python

Veja como minha regex tem três grupos (parênteses) seguidos por três cores (e opcionalmente três estilos), mas usei uma abreviação para definir todas as cores para 'negrito', para o grupo 'preto', que corresponde ao texto entre colchetes , sai como cinza escuro.)

Observe também como eu tive que adicionar 2>&1ao final da invocação do Python, porque a saída do unittest está no stderr, então eu a transferi para o stdout para que eu possa canalizá-lo para o colout.

Geralmente, é tão fácil de usar que, muitas vezes, me pego criando novas invocações de colout on-the-fly e reutilizando ou modificando-as no meu histórico de linha de comando.

A única desvantagem disso é que ele vem como um pacote Python, não como um executável independente, então você precisa instalá-lo usando o pip, ou sudo python setup.py install.

Jonathan Hartley
fonte
1

Eu uso o invólucro colorido .

O cw é um invólucro de cor ANSI em tempo real e não intrusivo para comandos comuns baseados em unix no GNU / linux. O cw foi projetado para simular o ambiente dos comandos que estão sendo executados, de modo que, se uma pessoa digitar 'du', 'df', 'ping' etc. no shell, colorirá automaticamente a saída em tempo real, de acordo com uma definição arquivo contendo o formato de cor desejado. O cw suporta cores de correspondência curinga, cores tokenizadas, cabeçalhos / rodapés, cores de cenário de caso, cores de definição dependentes da linha de comando e incluem mais de 50 arquivos de definição predefinidos.

É quase perfeito, mas depois que descobri que o ps no shell interativo retorna uma saída diferente comparando o ps em um pipe.

user3132194
fonte
0

Para Mac, você pode usar o seguinte, conforme especificado aqui

if [ "$TERM" = xterm ]; then TERM=xterm-256color; fi
doesnt_matter
fonte
0

se você quiser deixar o seu vimcolorido igual a mim, sugiro que você siga duas etapas:

  1. aprenda a ativar o recurso seguindo este link: ative o realce da sintaxe de cores no vi ou no vim .

etapas principais no link:

  1. Edite o arquivo ~ / .vimrc digitando o comando: vi ~ / .vimrc

  2. Anexe a seguinte opção: sintaxe em

  3. Salve e feche o arquivo

  4. Teste-o executando o comando vim : vim foo.sh

  1. encontre o esquema de cores desejado e use-o. O esquema que eu uso: o esquema que estou usando
ZhaoGang
fonte
Ao usar links para fontes externas, verifique a parte "Fornecer contexto para links" ( cite
Gert van den Berg
0

Se bash é sua escolha, recomendo oh-my-bash . Se zsh é sua escolha, recomendo oh-my-zsh . Ambos suportam a colorização do seu terminal e saída diferente.

TimWirtjes
fonte
0

Eu gostaria de anunciar humildemente a minha recente publicação de taou textattr , uma ferramenta de biblioteca e de linha de comando que tem o objetivo de fazer a cor adicionando e atributos para embelezar a saída do terminal do seu programa mais fácil de traduzir especificações legíveis em códigos de escape ANSI.

Por exemplo:

echo "The Git repo $(ta yellow)${CUR_REPO}$(ta off) is $(ta green)up-to-date$(ta off)"

ou ainda mais curto:

echo "The Git repo $(ta y)${CUR_REPO}$(ta f) is $(ta g)up-to-date$(ta f)"

ou uma alternativa:

tawrite "The Git repo " @y ${CUR_REPO} @f " is " @g up-to-date @f "\n"

lhe dará algo como:

insira a descrição da imagem aqui

Atualmente, esta biblioteca é utilizável em quatro idiomas C, C ++, D e Python, além do uso da linha de comando do seu shell favorito.

Observe que ele não colore automaticamente a saída de outros programas. É um utilitário que ajuda você a não ter que se lembrar dos códigos abstrusos. Você só precisa usar os nomes óbvios das cores ou suas abreviações rgb cmyk w (hite) (of) f .

Para mais detalhes, visite o repositório textattr .

jamadagni
fonte