Окраска вашего терминала и оболочки?

262

Я провожу большую часть своего времени, работая в среде Unix и используя эмуляторы терминала. Я пытаюсь использовать цвет в командной строке, потому что цвет делает вывод более полезным и интуитивно понятным.

Какие варианты существуют, чтобы добавить цвет в мою терминальную среду? Какие трюки вы используете? С какими подводными камнями вы столкнулись?

К сожалению, поддержка цвета варьируется в зависимости от типа терминала, ОС, настроек TERM, утилит, ошибочных реализаций и т. Д.

Вот несколько советов из моей настройки после долгих экспериментов:

  1. Я склонен устанавливать TERM=xterm-color, что поддерживается на большинстве хостов (но не на всех).
  2. Я работаю на разных хостах, разных версиях ОС и т. Д. Я использую все, от macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux и FreeBSD. Я стараюсь сделать вещи простыми и общими, если это возможно.
  3. Я делаю кучу работы, используя GNU screen, что добавляет еще один интересный уровень.
  4. Многие ОС устанавливают такие вещи как dircolorsи по умолчанию, и я не хочу изменять это на сотне разных хостов. Поэтому я стараюсь придерживаться значений по умолчанию. Вместо этого я настраиваю цветовую конфигурацию моего терминала.
  5. Использование цвета для некоторого Unix команд ( ls, grep, less, vim) и Баш строке . Кажется, что эти команды используют стандартную « escape-последовательность ANSI ». Например:

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

Я опубликую .bashrcи отвечу на свой вопрос Jeopardy Style.

Стефан Ласевский
источник
Кстати, мой подход (см. ответ ниже) решает проблемы, связанные с различиями в OSX и Linux, например, цвет на одном - ls -G, а на другом - ls --color-auto
Майкл Даррант
1
Кто-нибудь видел инструмент для окрашивания столбцов? Это column -t --color?
Томаш Поспишек

Ответы:

121

Вот несколько вещей, которые вы можете сделать:

Редакторы + код
Многие редакторы имеют поддержку подсветки синтаксиса. vimи emacsвключить его по умолчанию. Вы также можете включить его вnano .

Вы также можете синтаксически выделить код на терминале, используя Pygments в качестве инструмента командной строки.

grep
grep --color=auto выделяет все совпадения Вы также можете использовать его, export GREP_OPTIONS='--color=auto'чтобы сделать его постоянным без псевдонима. Если вы используете --color=always, он будет использовать цвет даже при обвязке , что сбивает с толку.

Ls

ls --color=always

Цвета указаны по:

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

(подсказка: dircolorsможет быть полезным)

PS1
Вы можете настроить PS1 (приглашение оболочки) на использование цветов. Например:

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

Будет производить PS1, как:

[желтый] lucas @ ubuntu: [красный] ~ [обычный] $

Вы можете стать действительно творческим с этим. Как идея:

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

Ставит панель в верхней части вашего терминала с некоторой случайной информацией. (Для достижения наилучших результатов также используйте alias clear="echo -e '\e[2J\n\n'".)

Избавляемся от последовательностей побега

Если что-то застряло при выводе цвета, когда вы этого не хотите, я использую эту sedстроку для удаления escape-последовательностей:

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

Если вы хотите более аутентичный опыт, вы также можете избавиться от строк, начинающихся с \e[8m, что указывает терминалу скрыть текст. (Широко не поддерживается.)

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

Также обратите внимание, что эти ^ [s должны быть действительными, буквальными ^ [s. Вы можете ввести их, нажав ^ V ^ [в bash, то есть Ctrl+ V, Ctrl+ [.

Лукас Джонс
источник
1
Первая PS1 линия следует читать так: PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '. После четвертой обратной косой черты есть лишний х.
Крис
3
Экраны должны быть заключены во \[...\]вторую, иначе команды во второй строке перезапишут первую строку. PS1 = '[\ e [33; 1m] \ u @ \ h: [\ e [31m] \ W \ e [0m \ $'
yanglifu90
ls --color=alwaysНе работает. Подход @Michael Durrant лучше для этого:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.
83

Я также использую:

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

И если вам нравится раскрашивать подсказки, вам могут пригодиться определенные цветовые переменные:

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'

И тогда моя подсказка выглядит примерно так:

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) вызывает скрипт python в моем ~ / sbin, который печатает информацию контроля версий о текущем пути. Включает поддержку Mercurial, Git, Svn, Cvs и т. Д. У автора скрипта есть источник здесь .

Скриншот Bash

Это полный источник моей быстрой настройки:

Kris
источник
Смотрите здесь для решения проблемы линии, которую я получил, когда использовал вышеупомянутую PS1: stackoverflow.com/questions/5087036/…
Ксандер Данн
Я обновил ответ, чтобы отразить экранированные скобки для цветов в приглашении. Спасибо!
Крис
1
$LSCOLORSи $CLICOLORдля BSD Ls. GNU ls (Linux) использует $LS_COLORSдругой синтаксис. Поскольку GNU чувствует себя как дома для меня, я использую, LSCOLORS=exgxfxDacxBaBaCaCaeaEaчтобы имитировать цвета GNU на BSD.
Адам Кац
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Стивен Алмерот
1
Вам может понадобиться .bashrcнайти файл, чтобы изменения вступили в силу. Вы можете сделать это с помощью следующей команды. source /path/to/.bashrc
Франсуа
18

grepи lsуже упоминались выше, если вы хотите много больше цветов проверить Generic Coloriser , его первоначальная цель состояла в том, чтобы раскрасить лога, но прямо из коробки также окрашивает ping, traceroute, gcc, make, netstat, diff, last, ldap, и cvs.

Это легко расширить, если вы знаете регулярные выражения. Я добавил psи nmapк списку (если вы попадете в, grcя буду более чем рад поделиться .conf файлами для этих двух инструментов)

(Между прочим, чтобы установить его через synaptic, pacmanи вам, возможно, повезет больше в поиске "grc")

Sygo
источник
grcтеперь поддерживает psпо умолчанию. Я был бы заинтересован в ваших nmapраскрасках. См. Также мой ответ для наложения всех этих имен таким образом, что они будут поглощать новые команды при обновлении grc.
Адам Кац
Я заметил, что. вот мой conf.nmap (и все остальное, действительно) gist.github.com/sygo/844982#file-conf-nmap - я заметил, что вы работаете в infosec, вам может показаться интересным conf.hexdump, я еще не закончил его хотя.
Sygo
Спасибо @Sygo. Я раздвоил и пересмотрел вашу суть. На самом деле я никогда не передавал данные с помощью git (не говоря уже о github), и я не могу понять, как предложить объединить их обратно с вами (полагаю, это потому, что gists слишком упрощены).
Адам Кац
Я подозреваю, что вы не можете, потому что это суть, а не надлежащее хранилище. Я все же проверил вашу вилку и определенно проверяю вашу версию. Мне любопытно, во что превратится этот шестнадцатеричный дамп ...
Sygo
11

Я оттачивал свой .bashrc на протяжении многих лет, чтобы работать как на OSX, так и на Ubuntu.
Я также уменьшил его размер до 28 строк с помощью компактных операторов условия.
С этим мое приглашение PS1 выглядит как: введите описание изображения здесь

со временем красным, имя пользователя зеленым, имя машины светло-синим, pwd темно-синим и git ветвь желтым.

Особенность моей подсказки PS1:

  • показывает ветку мерзавца!
  • длинные пути к каталогам (более 6 элементов) «обрезаются», чтобы показать верхние 3 и нижние 3 каталоги _между ними (это pwd sedчасть LOCATION).
  • возврат каретки в конце, так что подсказка всегда слева!

Соответствующие строки из моего .bashrcфайла:

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\]>'

Для ls с цветами, когда они доступны, и без ошибок, когда нет (то есть OSX):

ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Майкл Даррант
источник
1
Цвета доступны для lsOS X, но это делается с помощью export CLICOLOR=1.
ThomasW
3
@ThomasW, но не в Linux :-p Парень использует оба.
Джимми Кейн
1
Тем не менее, ThomasW прав, указав, что ответ ошибочен, говоря, что цвета недоступны lsв MacOS 10. Ответ также ошибочен, поскольку строки подсказок здесь на самом деле ошибочны. Они не правильно балансировать \[и\] , и возникали проблемы , по крайней мере , одного человека копирования этого ответа .
JdeBP
9

Цвета для справочных страниц ( подробнее ):

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

Цвета для grep ( 1;32ярко-зеленый, см. Другие посты здесь для других цветов):

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'

Больше цветов для 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

Установите grc( Generic Colouriser ) и добавьте его к своим псевдонимам:

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

Цвета для различий : слишком много содержимого для функции, используйте скрипт и добавьте в псевдоним его файл rc (необязательно, если вы установили 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;

Цвета для 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

демо bash prompt

Адам Кац
источник
1
Upvote для скриншота
Зеленый
PSWD()Раньше моя функция была POSIX-совместимой, но намного проще, используя обработку подстрок bash / zsh. Смотрите редакцию 6 для версии POSIX, которая включает в себя множество вопросительных знаков и совсем не адаптируется к ширине терминала. Я не обновлял скриншот, но это всего лишь небольшое изменение при ширине 80 символов.
Адам Кац
CLICOLOR=1у меня не работает с FreeBSD 11.2
Саймон С.
1
@SimonC. - Вы можете использовать утилиты GNU в своей системе FreeBSD, а не BSD. CLICOLOR=1 lsследует сделать то же самое, что и ls -Gпри использовании BSD ( ls -gна старых BSD). Если ls --colorработает (без ошибок), вы используете lsкоманду GNU и $CLICOLORигнорируется.
Адам Кац
1
@SimonC. - Для того, чтобы ~/.bashrcизменения вступили в силу, вы должны загрузить их . Либо запустить source ~/.bashrcили начать новый сеанс Баша (запустить терминал или запустить bash).
Адам Кац
8

Установите смелый / цветной запрос. От cyberciti.biz и BASFAQ

# '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 \$ "

Мне также удалось найти настройки цвета, которые широко поддерживаются и которые не печатают символы гоблидов в старых средах (даже FreeBSD4!), И, кажется, работают нормально, если TERM = vt100, xterm, xterm-color. (По большей части). Из моего .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
Стефан Ласевский
источник
1
Или, если вы хотите использовать ZSH, подсказка Фила Голда на aperiodic.net/phil/prompt - произведение искусства.
Цваллендер
5

То, что еще не было сказано здесь:

Чтобы раскрасить вывод ваших компиляций с помощью gcc, есть colorgcc от Johannes Schlüter

Для раскрашивания логов есть мультитейл

Чтобы раскрасить любой стандартный вывод, я собрал xcol

пример xcol

Я лично использую их из инструмента 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

Я использую эти переменные в моих сценариях, как так

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

Мне также нравится эта маленькая функция ColoredEcho (находится в 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

Извините, запрещено размещать больше ссылок

nachoparker
источник
2
Здравствуйте, как вы делаете флаги, для подсказки пути? Я упоминаю прямоугольные прутья с треугольными концами. Спасибо
Артур Виейра
это работает в терминале Ubuntu GNU также?
helle
lnav также является отличным инструментом для показа
цветных лог-файлов
4

Я предлагаю вам проверить ZSH и его плагин oh-my-zsh, который имеет одну из самых мощных консольных функций, которые я видел. Одним из них является выбор темы для вашего терминала. Это пример моей темы ... В tty цвета не такие теплые, но они такие же, как на этой картинке ... В любом случае, вам это понравится!

введите описание изображения здесь


источник
2
Если бы я мог, я бы понизил это за предложение Oh-My-ZSH. Как системный инженер, который много работает в Терминале, и как человек, который пытался внедрить zsh / oh-my-zsh в мой рабочий процесс, я могу честно сказать, что никогда не рекомендую ZSH никому. Конечно, вы можете использовать символическую ссылку zsh на файл с именем любой другой оболочки и эмулировать эту оболочку, но когда вы делаете это, она не читает ваш .bashrc, .bash_profile и т. Д. Кроме того, вы не можете вставить emulate bashсвой .zprofile или .zshrc файлы. Для тех, кто работает с расширенными функциями в BASH, есть много тонкостей, которые вас укусят. BASH лучше ш
Чарльз Аддис
2
Единственное, что ZSH имеет из коробки лучше, чем BASH, это завершение команд, но даже это программируется в BASH. Может быть, тот, кто не использует оболочку, за исключением случайных мирских задач, должен принять ZSH, но это не для тех, кому нужно широко использовать оболочку. =~оператор может укусить вас, путь ЗШ обрабатывает массивы могут укусить вас, и т.д. После использования ЗШ / Oh-My-ЗШ в течение 9 месяцев , у меня было достаточно. Я использовал собственную тему, которую я написал сам, я перенес ее на BASH и написал свою собственную строку подсказки git, и я никогда не оглядывался назад. Теперь я больше не беспокоюсь о переносимости
Чарльз Аддис
1
«У него одна из самых мощных консольных функций, которые я когда-либо видел. Одна из них - выбор темы для вашего терминала».
Джонатан Хартли
@JonathanHartley, ваш комментарий выглядит так, как будто вы оставили его неполным. ?
Wildcard
2
Спасибо за вашу заботу, но мой комментарий говорит все, что я хотел сказать.
Джонатан Хартли
4

Для просмотра различий в цвете используйте colordiff .

sudo apt-get install colordiff

Передайте любой вывод diff-формата в colordiff:

вывод diff по трубопроводу в colordiff

Это включает в себя некоторые из альтернативных форматов diff, например -y(рядом).

В качестве альтернативы, если он вызывается автономно (без каких-либо вложений в него), он действует как обертка вокруг 'diff' и окрашивает вывод. Следовательно, у меня есть это в моем .bashrc, для псевдонима 'diff' к colordiff.

# if colordiff is installed, use it
if type colordiff &>/dev/null ; then
    alias diff=colordiff
Джонатан Хартли
источник
1
В .bashrcпримере отсутствует финал fi, и его можно преобразовать в однострочную команду:type colordiff &> /dev/null && alias diff='colordiff'
Teemu Leisti
3

Некоторое оформление текста (выделено жирным шрифтом) позволяет легко различать корневую и некорневую оболочку. Для Zsh:

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

Для Баш:

if test $UID = 0
    then PS1="\033[1m${PS1}\033[0m"
fi
Миша арефьев
источник
Пожалуйста, укажите вашу оболочку. Единственным тегом, специфичным для оболочки, является bash , но я чувствую, что ваш код - нет bash.
Манатворк
@ Manatwork: извините, забыл упомянуть, что это был Zsh. Обновил мой пост.
Миша Арефьев
3

Я просто удивился тому же. У меня свой подход, но я ищу альтернативы.

Я пишу bash-оболочки вокруг вызовов программ и передаю их результаты sed. Что мне нравится, так sedэто то, что он будет изменять и отображать каждую строку сразу => не слишком много буферизации. Однако мне не нравится, что при каждом вызове упакованной программы sedкод анализируется и компилируется.

Например, это то, что я делаю, чтобы раскрасить вывод 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
источник
3

Для настройки подсказки у меня это есть в моем файле .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

Это дает мне подсказку, которая выглядит примерно так:

user@host(bash): ~/bin >

Рабочий каталог в зеленом. И имя пользователя будет жирным и голубым, если я не запускаю оболочку sudo, в этом случае имя пользователя («root») отображается жирным шрифтом и красным цветом.

Мне лично очень нравится хранить символы управления форматированием в переменных, потому что это облегчает чтение кода для настройки приглашения. Это также делает редактирование строки намного проще.

Причина, по которой я использую, tputзаключается в том, что он должен быть более универсально поддерживаемым, чем странные 033[01;31m\]последовательности. Кроме того, в качестве дополнительного бонуса, если вы сделаете это echo $PS1в приглашении, вы увидите необработанное приглашение с цветами вместо этих неразборчивых последовательностей управления.

Sildoreth
источник
2

Вы также можете попробовать проект, который помогает в раскраске скриптов, который называется ScriptEchoColor в source forge: http://scriptechocolor.sourceforge.net/

напр .:

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

Автоматические цвета настраиваются.

Вот пример, сделанный с ним: введите описание изображения здесь

Водолей Сила
источник
2

Отличный универсальный инструмент Python для окраски вывода команд - ' colout '

Вы даете ему регулярное выражение с N группами, за которым следует разделенный запятыми список из N цветов. Любой текст, соответствующий группе, будет отображаться соответствующим цветом.

Так, например, если вы смотрите на некоторые результаты теста:

python -m unittest discover -v

Неокрашенный вывод некоторых тестов Python

тогда вы можете украсить его:

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

Цветной вывод некоторых юнит-тестов Python

Посмотрите, как у моего регулярного выражения есть три группы (круглые скобки), за которыми следуют три цвета (и, возможно, три стиля), но я использовал сокращение, чтобы установить все цвета на «жирный», поэтому группа «черный», которая соответствует тексту в скобках выходит темно-серым.)

Обратите также внимание на то, как мне пришлось добавить 2>&1в конец вызова Python, потому что вывод unittest находится на stderr, поэтому я перенес его в stdout, чтобы можно было передать его в colout.

Как правило, это настолько просто в использовании, что я часто создаю новые вызовы colout на лету и повторно использую или изменяю их из своей истории командной строки.

Единственным недостатком является то, что он поставляется как пакет Python, а не как отдельный исполняемый файл, поэтому вам нужно установить его с помощью pip, или sudo python setup.py install.

Джонатан Хартли
источник
1

Я использую цветную обертку .

cw - это ненавязчивая оболочка цвета ANSI реального времени для распространенных команд на основе unix в GNU / linux. cw предназначен для имитации среды выполняемых команд, так что если человек вводит в свою оболочку «du», «df», «ping» и т. д., он автоматически окрашивает вывод в режиме реального времени в соответствии с определением файл, содержащий желаемый формат цвета. cw поддерживает раскраску совпадений с подстановочными знаками, разметку токенов, колонтитулы, раскраску сценариев, окраску определения, зависящую от командной строки, и включает более 50 готовых файлов определений.

Это почти незаметно, но как только я обнаружил, что ps в интерактивной оболочке возвращает различный вывод, сравнивая ps в канале

user3132194
источник
0

Для Mac вы можете использовать следующие, как указано здесь

if [ "$TERM" = xterm ]; then TERM=xterm-256color; fi
doesnt_matter
источник
0

если вы хотите сделать свой vimкрасочный, как я, я предлагаю вам сделать два шага:

  1. узнайте, как включить эту функцию, перейдя по этой ссылке: включите подсветку синтаксиса в vi или vim .

ключевые шаги в ссылке:

  1. Отредактируйте файл ~ / .vimrc, введя команду: vi ~ / .vimrc

  2. Добавьте следующую опцию: синтаксис включен

  3. Сохраните и закройте файл

  4. Проверьте это с помощью команды vim : vim foo.sh

  1. найдите цветовую схему, которая вам нравится, и используйте ее. Схема, которую я использую: схема, которую я использую
ZhaoGang
источник
При использовании ссылок на внешний источник вы должны проверить часть «Предоставить контекст для ссылок» (Цитировать важные части) соответствующей части руководства: unix.stackexchange.com/help/how-to-answer
Герт ван ден Берг
0

Если bash - ваш выбор, я рекомендую oh-my-bash . Если zsh - ваш выбор, я рекомендую oh-my-zsh . Оба поддерживают раскраску вашего терминала и разные выходные данные.

TimWirtjes
источник
0

Я хотел бы смиренно рекламировать свою недавнюю публикацию о taили textattr , библиотека и командной строки инструмент , который стремится сделать добавление цвета и атрибуты для украшения терминал вывода вашей программы легче переводить удобочитаемых спецификации в управляющие коды ANSI.

Например:

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

или еще короче

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

или альтернативный:

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

даст вам что-то вроде:

введите описание изображения здесь

В настоящее время эта библиотека может использоваться на четырех языках C, C ++, D и Python, кроме использования в командной строке из вашей любимой оболочки.

Обратите внимание, что он не окрашивает автоматически выходные данные других программ. Это скорее утилита, которая поможет вам не запоминать заумные коды. Вам нужно использовать только очевидные названия цветов или их легко запоминающиеся сокращения rgb cmyk w (hite) (of) f .

Для более подробной информации посетите репозиторий textattr .

Джамадагни
источник