나는 대부분의 시간을 유닉스 환경에서 작업하고 터미널 에뮬레이터를 사용합니다. 색상은 출력이 더 유용하고 직관적이기 때문에 명령 줄에서 색상을 사용하려고합니다.
터미널 환경에 색상을 추가하는 데 어떤 옵션이 있습니까? 어떤 트릭을 사용하십니까? 어떤 함정이 있습니까?
불행히도 색상 지원은 터미널 유형, OS, TERM 설정, 유틸리티, 버그 구현 등에 따라 다릅니다.
다음은 많은 실험을 거친 후 설정에서 얻은 몇 가지 팁입니다.
- 나는
TERM=xterm-color
대부분의 호스트 (모두는 아님)에서 지원되는 을 설정하는 경향이 있습니다. - 저는 여러 다른 호스트, 다른 OS 버전 등에서 작업합니다. macOS X, Ubuntu Linux, RHEL / CentOS / Scientific Linux 및 FreeBSD의 모든 것을 사용합니다. 가능한 한 간단하고 일반적인 것을 유지하려고합니다.
- GNU를 사용하여 많은 작업을 수행하여
screen
재미를 더합니다. - 많은 OS
dircolors
가 기본적으로 비슷하게 설정 하고 있으며 백 가지 다른 호스트에서이를 수정하고 싶지 않습니다. 그래서 나는 기본값을 고수하려고합니다. 대신 터미널의 색상 구성을 조정했습니다. -
일부 색상 사용 유닉스 명령 (
ls
,grep
,less
,vim
)와 배쉬 프롬프트 . 이 명령은 표준 ” ANSI 이스케이프 시퀀스 ” 를 사용하는 것 같습니다 . 예를 들면 다음과 같습니다.alias less='less --RAW-CONTROL-CHARS' export LS_OPTS='--color=auto' alias ls='ls ${LS_OPTS}'
저를 게시 .bashrc
하고 제 질문 Jeopardy Style에 답하겠습니다.
답변
수행 할 수있는 몇 가지 작업은 다음과 같습니다.
편집자 + 코드
많은 편집자들이 구문 강조 기능을 지원합니다. 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+ 를 눌러 입력 할 수 있습니다 [.
답변
나는 또한 사용한다 :
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 소스 를가 집니다 .
이것은 내 프롬프트 구성 의 전체 소스 입니다.
답변
grep
그리고 ls
이미 많은 색상을 확인하려는 경우, 언급 된 일반 Coloriser을 , 초기 목적은 로그 파일을 색상 화했다, 그러나 상자에서 꺼내 자마자 바로 그것은 또한 색깔을 입 힙니다 ping
, traceroute
, gcc
, make
, netstat
, diff
, last
, ldap
,와 cvs
.
정규식을 알고 있으면 쉽게 확장됩니다. 추가 ps
하고 nmap
목록에 추가했습니다 (들어가면 grc
두 도구의 .conf 파일을 공유하게되어 기쁩니다)
(, BTW을 통해 설치 synaptic
, pacman
그리고 모두 당신은 더 나은 행운 “GRC”에 대한 검색을 할 수도 있습니다)
답변
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'
답변
매뉴얼 페이지의 색상 ( 자세한 내용 ) :
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
답변
굵게 / 컬러 프롬프트를 설정하십시오. 에서 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 \$ "
또한 널리 지원되는 색상 설정을 찾았으며 이전 환경 (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