Розфарбування середовища вашого терміналу та оболонки?


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) і Баш рядку . Ці команди, здається, використовують стандартні " послідовності відходу ANSI ". Наприклад:

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

Я опублікую своє .bashrcта відповім на власне запитання Стиль небезпеки.


fyi мій підхід (див. відповідь нижче) вирішує проблеми з відмінностями OSX та Linux, наприклад, колір на одному - ls -G, а на іншому ls --color-auto
Michael Durrant

1
Хтось бачив інструмент для фарбування стовпців? Що таке column -t --color?
Tomáš Pospíšek

Відповіді:


121

Ось кілька речей, які ви можете зробити:

Редактори + Код
Багато редакторів підтримують підкреслення синтаксису. vimі emacsмати його за замовчуванням. Ви також можете включити його підnano .

Ви також можете виділити синтаксичний код на терміналі, використовуючи Pygments як інструмент командного рядка.

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

лс

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рядок, щоб зняти послідовності втечі:

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; 1м] \ 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

Це повне джерело моєї швидкої конфігурації:


Дивіться тут, щоб вирішити проблему з лінією, яку я отримав, коли я використав вищевказаний PS1: stackoverflow.com/questions/5087036/…
Xander Dunn

Я оновив відповідь, щоб відобразити збіглі дужки для кольорів у запиті. Дякую!
Kris

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 файлами для цих двох інструментів)

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


grcтепер підтримується psза замовчуванням. Мене зацікавлять ваші nmapрозмальовки. Дивіться також мою відповідь про згладжування всього цього таким чином, що поглинає нові команди під час оновлення grc.
Адам Кац

Я помітив що. ось мій conf.nmap (і все інше, насправді) gist.github.com/sygo/844982#file-conf-nmap - я помітив, що ви працюєте в infosec, вам може здатися цікавим conf.hexdump, я ще не закінчив його хоч.
Sygo

Дякую @Sygo Я роздвоїв і переглянув вашу суть. Я ніколи насправді не вдавав дані з git (не кажучи вже про суть github), і не можу зрозуміти, як запропонувати об'єднати їх назад (я здогадуюсь, що це тому, що сутності занадто спрощені).
Адам Кац

Я підозрюю, що ви не можете, тому що це суть, а не належне сховище. Хоча я перевірив вашу вилку, і я напевно даю вашу версію. Мені цікаво, в що перетвориться той шістнадцятковий смітник ...
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 -; }

Кольори для грепу ( 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
Оновлення скріншота
Зелений

Моя PSWD()функція була сумісною з POSIX, але це набагато простіше полегшити за допомогою bash / zsh з підрядками. Дивіться версію 6 для версії POSIX, яка включає багато знаків запитання і зовсім не адаптується до ширини терміналу. Я не оновлював скріншот, але це лише незначна зміна на ширині 80 символів.
Адам Кац

CLICOLOR=1не працює для мене з FREEBSD 11.2
Simon C.

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 (запустити термінал або запустити bash).
Адам Кац

8

Встановіть жирний / кольоровий рядок. Від cyberciti.biz та 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 \$ "

Також мені вдалося знайти налаштування кольорів, які широко підтримуються, і які не друкують символів gobbledygook у старих середовищах (навіть 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 - витвір мистецтва.
tsvallender


5

Речі, про які тут уже не сказано:

Щоб розфарбувати вихід ваших збірок за допомогою gcc, існує colorgcc Йоганнеса Шлютера

Щоб розфарбувати журнали, існує багатоповерхівка

Щоб розфарбувати будь-який stdout, я зібрав 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}"

Мені також подобається ця маленька функція colorEcho (знайдена у стеку 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

На жаль, не можна публікувати більше посилань


2
Привіт, як ви робите прапори для швидкого шляху? Я згадую прямокутні бруски з трикутними кінцями Спасибі
Артур Вієйра

чи працює він і в терміналі ubuntu gnu?
helle

lnav - також чудовий інструмент для показу кольорових журналів
Кирило Шабойсо

4

Я пропоную вам перевірити ZSH та його плагін oh-my-zsh, який має одну з найбільш потужних функцій консолі, яку я бачив. Один з них - вибір теми для вашого терміналу. Це приклад моєї теми ... У тти кольори не такі теплі, але вони такі ж, як на цій фотографії ... Будь-який спосіб вам сподобається!

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


2
Якби я міг, я б схвалив це за пропозицію Oh-My-ZSH. Як системний інженер, який широко працює в Терміналі, і як хтось, хто намагався прийняти zsh / oh-my-zsh у свій робочий процес, можу чесно сказати, що ніколи б не рекомендував ZSH нікому. Звичайно, ви можете символізувати zsh до файлу, названого за будь-якою іншою оболонкою, та емулювати цю оболонку, але коли ви це зробите, вона не читає ваші .bashrc, .bash_profile тощо. Також ви не можете ввести emulate bash.zprofile або .zshrc файли. Для всіх, хто працює з вдосконаленими можливостями в BASH, є багато тонкощів, які будуть вас кусати. БАШ - кращий ш.
Чарльз Аддіс

2
Єдине, що ZSH має поза полем, що краще, ніж BASH, - це завершення команд, але навіть це програмоване в BASH. Можливо, хтось, хто не використовує оболонку, крім випадкових повсякденних завдань, повинен прийняти ZSH, але це не для тих, кому потрібно широко використовувати оболонку. =~оператор може вкусити вас, шлях ЗШ обробляє масиви можуть вкусити вас, і так далі Після використання ЗШ / Oh-My-ЗШ в протягом 9 місяців , у мене було достатньо. Я використовував власну тему, яку я написав сам, я переніс її на BASH і написав власну підказку щодо git, і я ніколи не оглядався. Зараз я більше не турбуюся про портативність
Чарльз Аддіс

1
"У неї є одна з найпотужніших функцій консолі, яку я бачив. Один з них - це вибір теми для вашого терміналу."
Джонатан Хартлі

@JonathanHartley, ваш коментар виглядає так, що ви залишили його незавершеним. ?
Wildcard

2
Дякую за турботу, але мій коментар говорить усе, що я мав намір сказати.
Джонатан Хартлі

4

Для перегляду різного виходу в кольорі використовуйте colordiff .

sudo apt-get install colordiff

Складіть будь-який вихід різного формату в colordiff:

вихід різної труби в кольорову різницю

Сюди входять деякі альтернативні формати diff, як-от -y(поруч.)

Крім того, якщо викликати окремий (без нічого вкладеного в нього), він виконує функцію обгортки навколо 'diff' і забарвлює вихід. Отже, я маю це у своєму .bashrc, щоб псевдонім "розрізнювався" на 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'
однорядну

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. Оновлено мою публікацію.
Mischa Arefiev

3

Я просто дивувався тому ж. У мене є власний підхід, але я шукаю альтернативи.

Я пишу баш-обгортки навколо програмних дзвінків і передаю їх вихід 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'

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, і в цьому випадку ім'я користувача ("корінь") відображається жирним і червоним кольором.

Мені особисто дуже подобається, щоб контрольні символи форматування зберігалися у змінних, оскільки це полегшує читання коду для встановлення підказки. Це також робить редагування рядка набагато простіше.

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


2

Ви можете спробувати проект, який допомагає також виводити кольорові сценарії, його ім'ям ScriptEchoColor у джерелі кузня: 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.

Це, як правило, настільки просте у використанні, що я часто опиняюся, коли створюю нові виклики кольорів під час руху та повторно використовую або змінюю їх з моєї історії командного рядка.

Єдиним недоліком цього є те, що він поставляється як пакет Python, а не окремий виконуваний файл, тому вам потрібно встановити його за допомогою pip, або sudo python setup.py install.



1

Я використовую кольорову обгортку .

cw - ненав'язлива кольорова обгортка ANSI у режимі реального часу для загальних команд на основі Unix у GNU / linux. cw розроблений для імітації середовища виконуваних команд, так що якщо людина вводить у свою оболонку 'du', 'df', 'ping' і т. д., вона автоматично забарвлює вихід у режимі реального часу відповідно до визначення файл, що містить бажаний кольоровий формат. У програмі cw підтримується забарвлення підстановки підкреслених підкреслень, забарвлення в токенізовані колонтитули, колонтитули та колонтитули, розфарбовування сценарію випадку, розмальовки залежно від командного рядка та включає понад 50 файлів попереднього визначення.

Це майже безшовно, але одного разу я виявив, що PS в інтерактивній оболонці повертає різний вихід, порівнюючи ps в трубі.


0

Для Mac ви можете використовувати наступне, як зазначено тут

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

0

якщо ви хочете зробити свій vimбарвистий так само, як я, пропоную вам виконати два кроки:

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

основні кроки у посиланні:

  1. Відредагуйте файл ~ / .vimrc, ввівши команду: vi ~ / .vimrc

  2. Додайте наступний варіант: синтаксис увімкнено

  3. Збережіть і закрийте файл

  4. Перевірте його, виконавши команду vim: vim foo.sh

  1. знайдіть вподобану вам колірну гамму та використовуйте її. Схема, яку я використовую: схема, яку я використовую

При використанні посилань на зовнішнє джерело, ви повинні перевірити «Забезпечити контекст для посилання» частина (цитую важливі частини) відповідної частини керівництва: unix.stackexchange.com/help/how-to-answer
Герт ван ден Берг

0

Якщо bash - це ваш вибір, я рекомендую oh-my-bash . Якщо zsh - це ваш вибір, я рекомендую oh-my-zsh . Як підтримка колоризації вашого терміналу, так і різний вихід.


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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.