터미널과 쉘 환경을 채색합니까?


262

나는 대부분의 시간을 유닉스 환경에서 작업하고 터미널 에뮬레이터를 사용합니다. 색상은 출력이 더 유용하고 직관적이기 때문에 명령 줄에서 색상을 사용하려고합니다.

터미널 환경에 색상을 추가하는 데 어떤 옵션이 있습니까? 어떤 트릭을 사용하십니까? 어떤 함정이 있습니까?

불행히도 색상 지원은 터미널 유형, OS, TERM 설정, 유틸리티, 버그 구현 등에 따라 다릅니다.

다음은 많은 실험을 거친 후 설정에서 얻은 몇 가지 팁입니다.

  1. 나는 TERM=xterm-color대부분의 호스트 (모두는 아님)에서 지원되는 을 설정하는 경향이 있습니다.
  2. 저는 여러 다른 호스트, 다른 OS 버전 등에서 작업합니다. macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux 및 FreeBSD의 모든 것을 사용합니다. 가능한 한 간단하고 일반적인 것을 유지하려고합니다.
  3. GNU를 사용하여 많은 작업을 수행하여 screen재미를 더합니다.
  4. 많은 OS dircolors가 기본적으로 비슷하게 설정 하고 있으며 백 가지 다른 호스트에서이를 수정하고 싶지 않습니다. 그래서 나는 기본값을 고수하려고합니다. 대신 터미널의 색상 구성을 조정했습니다.
  5. 일부 색상 사용 유닉스 명령 ( ls, grep, less, vim)와 배쉬 프롬프트 . 이 명령은 표준 " ANSI 이스케이프 시퀀스 " 를 사용하는 것 같습니다 . 예를 들면 다음과 같습니다.

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

저를 게시 .bashrc하고 제 질문 Jeopardy Style에 답하겠습니다.


참고하시기 바랍니다 하나 예를 들어, 색상, OSX와 리눅스의 차이와 문제를 해결합니다 (아래 답변을 참조) LS의 -G 내 방식이고, 다른 하나에 LS --color - 자동이다
마이클 듀런트

1
열 색상을 지정하는 도구를 본 사람이 있습니까? 그건 column -t --color?
Tomáš Pospíšek

답변:


121

수행 할 수있는 몇 가지 작업은 다음과 같습니다.

편집자 + 코드
많은 편집자들이 구문 강조 기능을 지원합니다. vim그리고 emacs기본적으로 그것을있다. 에서 활성화nano 할 수도 있습니다 .

피그먼트 를 명령 줄 도구로 사용하여 터미널에서 하이라이트 코드를 구 문화 할 수도 있습니다 .

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을 생성합니다.

[yellow] 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이어야합니다. bash에서 ^ V ^ [, 즉 Ctrl+ V, Ctrl+ 를 눌러 입력 할 수 있습니다 [.


1
첫 번째 PS1 줄은 다음과 같아야합니다 PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '. 네 번째 백 슬래시 뒤에 불필요한 x가 있습니다.
Chris

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)는 현재 경로에 대한 버전 제어 정보를 인쇄하는 ~ / sbin에서 Python 스크립트를 호출합니다. Mercurial, Git, Svn, Cvs 등을 지원합니다. 스크립트 작성자는 here 소스 를가 집니다 .

배쉬 프롬프트 스크린 샷

이것은 내 프롬프트 구성 의 전체 소스 입니다.


나는 위의 PS1을 사용할 때 내가 가진 라인 문제에 대한 해결책 여기를 참조하십시오 : stackoverflow.com/questions/5087036/...
젠더 던에게

프롬프트에서 색상의 이스케이프 처리 된 괄호를 반영하도록 답변을 업데이트했습니다. 감사!
Kris

1
$LSCOLORS그리고 $CLICOLORBSD ls 용입니다. GNU ls (Linux)는 $LS_COLORS다른 구문으로 사용 합니다. GNU가 저의 집처럼 느껴지면서 저는 LSCOLORS=exgxfxDacxBaBaCaCaeaEaBSD에서 GNU의 색상을 모방 하는 데 사용 합니다.
Adam Katz

grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
Steven Almeroth

1
.bashrc수정 사항을 적용 하려면 파일 을 소싱해야 할 수도 있습니다. 다음 명령으로 수행 할 수 있습니다. source /path/to/.bashrc
François

18

grep그리고 ls이미 많은 색상을 확인하려는 경우, 언급 된 일반 Coloriser을 , 초기 목적은 로그 파일을 색상 화했다, 그러나 상자에서 꺼내 자마자 바로 그것은 또한 색깔을 입 힙니다 ping, traceroute, gcc, make, netstat, diff, last, ldap,와 cvs.

정규식을 알고 있으면 쉽게 확장됩니다. 추가 ps하고 nmap목록에 추가했습니다 (들어가면 grc두 도구의 .conf 파일을 공유하게되어 기쁩니다)

(, BTW을 통해 설치 synaptic, pacman그리고 모두 당신은 더 나은 행운 "GRC"에 대한 검색을 할 수도 있습니다)


grc이제 ps기본적으로 지원합니다 . 나는 당신의 nmap채색에 관심이 있습니다 . grc를 업그레이드 할 때 새로운 명령을 흡수하는 방식으로 이러한 모든 별칭의 내 대답을 참조하십시오.
Adam Katz

난 그것을 알아 챘다. 여기 내 conf.nmap (및 다른 모든 것) gist.github.com/sygo/844982#file-conf-nmap-infosec 에서 일하는 것을 보았습니다 .conf.hexdump가 흥미로울 것입니다. 아직 완성하지 못했습니다. 그러나.
Sygo

감사합니다 @ Sygo. 나는 당신의 요점을 갈래하고 수정했습니다. 나는 실제로 git을 사용하여 데이터를 커밋 한 적이 없으며 (github의 요점은 말할 것도없고) 다시 병합을 제안하는 방법을 알 수 없습니다 (Gist가 너무 단순하기 때문에 추측합니다).
Adam Katz

나는 그것이 요지이며 적절한 저장소가 아니기 때문에 당신이 할 수 없다고 생각합니다. 나는 당신의 포크를 체크 아웃했고 나는 당신의 버전을 확실히 제공하고 있습니다. 16 진수 덤프가 어떻게 될지 궁금합니다.
Sygo

11

OSX와 Ubuntu 모두에서 작업하기 위해 수년 동안 .bashrc를 연마했습니다.
또한 소형 조건문으로 크기를 28 줄로 줄였습니다.
이를 통해 PS1 프롬프트는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

시간은 빨간색, 사용자 이름은 녹색, 기계 이름은 연한 파랑, 암호는 진한 파란색, 자식은 노란색입니다.

내 PS1 프롬프트 기능 :

  • 자식 분기를 보여줍니다!
  • 긴 디렉토리 경로 (6 개 이상의 요소)는 _그 사이 pwd sed에 LOCATION 의 일부인 상위 3 개 및 하위 3 개 디렉토리를 표시하기 위해 '잘라 내기'됩니다 .
  • 프롬프트가 항상 왼쪽에 있도록 캐리지 끝에서 돌아옵니다!

.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이지만 리눅스에는 없습니다 :-p 남자는 둘 다 사용합니다.
Jimmy Kane

1
그럼에도 불구하고, ThomasW는 lsMacOS 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
}

diff의 색상 : 함수의 내용이 너무 많으면 스크립트를 사용하고 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 프롬프트 데모


1
스크린 샷
Green

PSWD()함수는 POSIX와 호환되었지만 bash / zsh 하위 문자열 처리를 사용하면 훨씬 쉽게 사용할 수 있습니다. POSIX 버전 은 개정판 6 을 참조하십시오 . 여기에는 많은 물음표가 포함되며 터미널 너비에 전혀 맞지 않습니다. 스크린 샷을 업데이트하지는 않았지만 80 자 너비에서 약간만 변경되었습니다.
Adam Katz

CLICOLOR=1FREEBSD 11.2
Simon C.

1
@SimonC. – FreeBSD 시스템에서 BSD가 아닌 GNU 유틸리티를 사용 중일 수 있습니다. BSD CLICOLOR=1 lsls -G사용 하는 것과 같은 일을해야합니다 ( ls -g이전 BSD에서). ls --color작동 하면 (오류 없음) GNU ls명령을 사용 중이며 $CLICOLOR무시됩니다.
Adam Katz

1
@SimonC. – ~/.bashrc변경 사항을 적용 하려면 실제로로드해야 합니다. source ~/.bashrc새 bash 세션을 실행 하거나 시작하십시오 (터미널을 시작하거나 실행하십시오 bash).
Adam Katz

8

굵게 / 컬러 프롬프트를 설정하십시오. 에서 cyberciti.bizBashFAQ

# '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조차도)에서 gobbledygook 문자를 인쇄하지 않으며 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 의 Phil Gold의 프롬프트 는 예술 작품입니다.
tsvallender


5

아직 여기에 언급되지 않은 것들 :

gcc로 컴파일 결과를 채색하기 위해 Johannes Schlüter의 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}"

나는 또한이 작은 함수 coloredEcho를 좋아한다 (스택 오버 플로우에서 발견 됨)

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
안녕하세요, 프롬프트 경로에 어떻게 플래그를 만드나요? 삼각형 끝이있는 사각형 막대를 언급하고 있습니다. 감사
Artur Vieira

우분투 GNU 터미널에서도 작동합니까?
helle February

lnav 는 또한 색상이 지정된 로그 파일을 보여주는 훌륭한 도구입니다.
Cyril Chaboisseau

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가 더 좋습니다.
Charles Addis

2
ZSH가 BASH보다 나은 유일한 것은 명령 완료 뿐이지 만 BASH에서도 프로그래밍 가능합니다. 때때로 일상적인 작업을 제외하고 셸을 사용하지 않는 사람은 ZSH를 채택해야하지만 셸을 광범위하게 사용해야하는 사람에게는 적합하지 않습니다. =~운영자는, zsh을가 배열 내가 그것을 충분히 있었다 약 9 개월 동안 zsh을 / 아 - 내 - zsh을 사용 후 등을 물린 수 처리하는 방법을 당신을 물지 수 있습니다. 나는 내가 쓴 맞춤 테마를 사용하고 있었고, 그것을 BASH로 이식하고 내 자식 git promptline을 작성했으며 결코 뒤돌아 보지 않았습니다. 이제 더 이상 이식성에 대해 걱정하지 않습니다
Charles Addis

1
"내가 본 가장 강력한 콘솔 기능 중 하나입니다. 그 중 하나는 터미널의 테마를 선택하는 것입니다."
Jonathan Hartley

@JonathanHartley, 귀하의 의견은 불완전한 것으로 보입니다. ?
와일드 카드

2
걱정 해 주셔서 감사하지만 내 의견은 내가 말하려는 모든 것을 말합니다.
Jonathan Hartley

4

diff 출력을 컬러로 보려면 colordiff를 사용하십시오 .

sudo apt-get install colordiff

diff 형식 출력을 colordiff로 파이프하십시오.

colordiff로 파이프 된 diff의 출력

여기에는 -y(나란히 )와 같은 diff의 대체 형식이 포함됩니다 .

또는 독립형으로 호출 된 경우 (파이프 된 것이 없으면) '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'
티무 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

@manatwork : 죄송합니다. Zsh라는 것을 언급하지 않았습니다. 내 게시물을 업데이트했습니다.
Mischa Arefiev

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'

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프롬프트에서 수행하면 이해할 수없는 제어 시퀀스 대신 색상이 있는 원시 프롬프트가 표시 됩니다.


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

명령 출력을 채색 하는 훌륭한 범용 파이썬 도구는 ' colout '입니다.

N 그룹으로 정규 표현식을 제공하고 쉼표로 구분 된 N 색상 목록을 제공합니다. 그룹과 일치하는 모든 텍스트가 해당 색상으로 표시됩니다.

예를 들어 테스트 출력을보고 있다면 :

python -m unittest discover -v

일부 Python 단위 테스트의 비 색상 출력

다음과 같이 가문비 나무를 가릴 수 있습니다.

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

일부 파이썬 단위 테스트의 컬러 출력

정규식에 3 개의 그룹 (괄호)과 3 개의 색상 (및 선택적으로 3 개의 스타일)이 어떻게 있는지 확인하십시오. 그러나 속기를 사용하여 모든 색상을 '굵게'로 설정했습니다. 그래서 'black'그룹은 괄호 안의 텍스트와 일치합니다 , 진한 회색으로 나타납니다.)

2>&1unittest의 출력이 stderr에 있기 때문에 파이썬 호출의 끝에 추가 해야하는 방법에 주목하십시오. 그래서 그것을 cold에 파이프 할 수 있도록 stdout으로 옮겼습니다.

이것은 일반적으로 사용하기 매우 쉬워서 종종 새로운 콜 아웃 호출을 즉시 생성하고 내 명령 줄 기록에서 재사용하거나 수정합니다.

그것의 유일한 단점은 독립 실행 파일이 아닌 Python 패키지로 제공되므로 pip 또는을 사용하여 설치해야한다는 것 sudo python setup.py install입니다.



1

나는 컬러 래퍼를 사용 합니다 .

cw는 GNU / 리눅스에서 일반적인 유닉스 기반 명령을위한 비 침입 실시간 ANSI 컬러 래퍼입니다. cw는 실행중인 명령의 환경을 시뮬레이션하도록 설계되어 사용자가 쉘에 'du', 'df', 'ping'등을 입력하면 정의에 따라 실시간으로 자동으로 출력 색상이 지정됩니다 원하는 색상 형식이 포함 된 파일. cw는 와일드 카드 일치 색상 표시, 토큰 화 된 색상 표시, 머리글 / 바닥 글, 사례 시나리오 색상 표시, 명령 줄 종속 정의 색상 표시를 지원하며 50 개 이상의 사전 정의 된 정의 파일을 포함합니다.

거의 매끄럽지 만 대화 형 쉘의 ps는 파이프의 ps를 비교하여 다른 출력을 반환한다는 것을 알았습니다.



0

vim나처럼 당신을 화려 하게 만들고 싶다면 두 단계를 따르는 것이 좋습니다.

  1. 이 링크를 따라 기능을 켜는 방법에 대해 학습하십시오. vi 또는 vim에서 색상 구문 강조 표시를 켜십시오 .

링크의 주요 단계 :

  1. 다음 명령을 입력하여 ~ / .vimrc 파일을 편집하십시오. vi ~ / .vimrc

  2. 다음 옵션을 추가하십시오 .

  3. 파일을 저장하고 닫습니다

  4. vim 명령을 실행하여 테스트하십시오 : vim foo.sh

  1. 원하는 색 구성표를 찾아서 사용하십시오. 내가 사용 하는 구성표 : 사용 중인 구성표

외부 소스에 대한 링크를 사용하는 경우 가이드 관련 부분의 "링크에 대한 컨텍스트 제공"부분 (견적 중요 부분)을 확인해야합니다. unix.stackexchange.com/help/how-to-answer
Gert van den Berg

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의 4 개 언어에서 사용할 수 있으며 즐겨 사용하는 쉘의 명령 줄 사용과는 별개입니다.

다른 프로그램의 출력을 자동으로 채색하지는 않습니다. 오히려 애매한 코드를 기억할 필요가없는 유틸리티입니다. 명백한 색상 이름이나 기억하기 쉬운 rgb cmyk w (hite)의 약어 만 사용하면됩니다.

자세한 내용 은 textattr repo를 방문하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.