본문 바로가기

4.개발 및 운영 환경

Bash shell coloring

Bash 쉘은 대표적인 unix 쉘이다. 거의 기본 쉘로 제공이 된다. 보통 표시되는 텍스트나 배경 색상은 단색이다. 너무 믿믿하고 요즘 colorfull한 세상에는 어딘가 어색하다. 그럼 이를 수정해볼까?

일단 Bash쉘에 대해 어느정도 알고 있다는 가정하에서 시작하겠다. 모르면, 직접 찾아보기를... 밑에 참조도 참고하세요.




간단한 예제

Bash 쉘의 색을 입히기 전에 Bash 쉘의 색 표현 방법을 잠시 알아보자. 이에 대한 재미난 예제가 있다. 쉘 프롬프트 가지고 장난 친건데, 아래 예제를 간단히 살펴보겠다.[1]

export에 의해서 PS1 환경변수에 값을 설정한 것이다.



예제를 보아서는 잘 모를 것이다.  이 예제는 단순히 PS1의 프롬프트에 현재 위치를 표시하고 마지막에 ">"를 추가한 것 뿐이다.



여기서는 앞에 이상한 기호 ("\e[32; 40m")이 붙었다. 이 값이 뒤에 오는 문자(열)의 색을 지정하는 이스케이프 값이다. 기본 형은 


\e[


여기서 ""이 설정되는 값을 의미한다. 여기서 색상을 표시하는데, 아래 같은 의미를 가진다.


\e[색상1;색상2m


색상1과 색상2은 10진수 값이 들어간다. 간단한 색 테이블은 다음과 같다.[1] 그럼 위의 예제에서 가로 32와 세로 40를 찾으면 현재 설정될 값을 알 수 있다. 간단히 바꿔서 테스트해보면 쉽게 알 수 있다.

찾기 쉽게 색상1은 글자색 기준으로 색상2는 배경색 기준으로 정리해서 배열하였다.


\e[32;40m


즉 32;40이면 글자는 녹색, 배경은 검은색이다.


\e[40;32;1m


32와 40 순서를 변경할 수 있고, 1값은 bold 표시한다는 의미이다. 이렇게 여러 속성 값을 뒤에 추가로 지정할 수 있다.(* 1값은 bold의 의미이나 실제 적용시 밝은 색상으로 적용되는 경우도 있다.)

Bash color table(ref: http://www.funtoo.org/en/articles/linux/tips/prompt/)[1]



그럼 기본 색상을 사용하려면 어떻게 해야되나? 터미널 기본 색상을 사용하려면,

\e[0m


을 사용하면 된다. 그럼 간단한 예를 보면,


다음은 다른 예제들 이다.

다양한 색상 표시 방법은 이것의 확장일 뿐이다.

ls에도 적용하기


실제 ls 명령에서 디렉토리나 파일의 색상을 표시하려면 명시적으로 사용해야하는 옵션이 있다. 바로 "--color"이다. 이는 ".bashrc"환경 파일 등에 ls에 alias해주면 간단히 해결 할 수 있다. 추가로 "-F" 옵션을 주면 디렉토리 명 뒤에 백슬러쉬("\")도 표시되게 하여 디렉토리를 따로 구분해서 표시할 수 있다.

alias ls='ls --color -F'


이때 표시되는 기본 색상도 좋으나, 새로 추가되는 파일 타입이나, 익숙한 색상으로 변경하려면 추가 작업이 필요하게 된다.


ls coloring 고전적인 방식

Bash 쉘에서 ls의 색상에 영향을 미치는 환경변수는 LS_COLORS이다. 이는 Linux 기준이며, 플랫폼 별로 약간식 차이가 있을 수 있기에 해당 플랫폼의 ls명령어를 확인해 보는 것이 중요하다. 간혹 LSCOLORS인 곳도 있다.


사용법은 LS_COLORS 환경변수에 특정한 형식에 맞게 값을 넣어주면 된다. 예를 들어;[3]

LS_COLORS='di=1:fi=0:ln=31:pi=5:so=5:bd=5:cd=5:or=31:mi=0:ex=35:*.rpm=90'


따옴표 사이에 있는 값이 설정 값이다. "인자=값"의 쌍이며 이들 간에 콜론(":")으로 구분된다. 인자의 의미는 다음과 같다.[3]
  • di = directory
  • fi = file
  • ln = symbolic link
  • pi = fifo file
  • so = socket file
  • bd = block (buffered) special file
  • cd = character (unbuffered) special file
  • or = symbolic link pointing to a non-existent file (orphan)
  • mi = non-existent file pointed to by a symbolic link (visible when you type ls -l)
  • ex = file which is executable (ie. has 'x' set in permissions).

적용 되는 값이 텍스트 모양과 색상 등을 지정하는게 각 숫자 값의 내용은 다음과 같다.
0   = default colour
1   = bold
4   = underlined
5   = flashing text
7   = reverse field
31  = red
32  = green
33  = orange
34  = blue
35  = purple
36  = cyan
37  = grey
40  = black background
41  = red background
42  = green background
43  = orange background
44  = blue background
45  = purple background
46  = cyan background
47  = grey background
90  = dark grey
91  = light red
92  = light green
93  = yellow
94  = light blue
95  = light purple
96  = turquoise
100 = dark grey background
101 = light red background
102 = light green background
103 = yellow background
104 = light blue background
105 = light purple background
106 = turquoise background

이 값은 앞의 bash의 color값과는 조금 틀리게 보일지 모르지만, 기본적으로 값 결과는 같다.

실제 활용은 .bashrc 환경 파일에 적당한 위치에 다음과 같이 추가하면 된다.
LS_COLORS='di=1:fi=0:ln=31:pi=5:so=5:bd=5:cd=5:or=31:mi=0:ex=35:*.rpm=90'
export LS_COLORS



ls coloring를 dircolors로 하기

이번은 조금 다른 방법을 사용하겠다. 앞에 방법은 지정되는 색상이 다양하면 LS_COLORS에 넣는 값이 길이가 커지고 전체적인 스크립 파일도 지저분해지고, 설정되 값이 무엇인지 해갈리는 경우도 많다. 이를 도와 줄 수 있는게 dircolors 명령어이다. 플랫폼별로 이 명령어가 없을 수 있다. 없으면 설치해주면 된다.

알아서 대충 찾아서 설치하길 바란다. 잘 안된다면 이번 내용은 건너뛰면 된다. ㅡ.ㅡ;

(내가 봐도 정말 성의 없군....)

여하튼 계속 해서...

dircolors는 자신만의 파일 안에 필요한 색을 설정하고 설정된 색을 해당 쉘에 맞게 변경해서 적용해준다. 단순한  wrapper 명령어 수준이다. 그러나 깔끔하게 색상을 목록 형태로 보여주고, 다양한 쉘에 맞게 변경해주무로 때에 따라 bash사용하다가 csh로 변경해도, 같은 색상표를 적용할 수 있는 장점이 있다.


사용법은 다음과 같다. 원하는 색상을 지정한 색 목록을 특정 파일로 저장한다. 보통 자신의 홈디렉토리에 ".dircolors"라고 지정해도 된다. 아니면 터미널이나 특정 조건에 따라 변경하고 싶다면, 다른 이름 등으로 변경해도 상관없다.


그리고 .bashrc의 적당한 위치에 아래와 같은 명령어를 넣어주면 된다.[4]

eval `dircolors -b ~/.dircolors`


위의 eval는 `` 안에 있는 명령어를 실행한 결과를 실행하는 명령어이다. "dircolors -b" 에 의해 .dircolors에 있는 내용을 bash 쉘에 맞게 변경해서 결과를 표시해주는 역활을 한다. 단순히 값을 변환 해주는 것뿐 적용되는 것이 아니기에 이를 적용하기 위해서 eval를 적용해줘야 한다.


여기서는 .dircolors로 기본으로 했지만 이를 변경하면 위의 eval에 .dircolors 파일명과 실제 저장되는 위치를 정확히 일치시켜줘야한다.


아래는 간단한 .dircolors 파일 예이다.
# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.

# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.

# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cygwin
TERM xterm
TERM vt100

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00 # global default, although everything should be something.
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link
FIFO 40;33 # pipe
SOCK 01;35 # socket
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file

# This is for files with execute permission:
EXEC 01;32

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')

# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32

.tar 01;31 # archives or compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z 01;31
.Z 01;31
.gz 01;31
.deb 01;31
.png 01;35 # image formats
.png 01;35
.bmp 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.mpg 01;37
.avi 01;37
.gl 01;37
.dl 01;37




이를 실행하면 "dircolors -b ~/.dircolors"만 실행하면 다음과 같다.



결론

Coloring은 작업에 도움을 주는 것일 뿐 실제 실행 결과에 있어서 아무런 영향이 없습니다. 오히려 너무 난잡하게 만들수 있겠죠. 즉, 그냥 보이기에 이쁘게 할 뿐이죠. 그래도 색이 들어가니 보이기에 좋네요.

보통 파일색을 지정할때 기본적인 색 외에 큰 범주에서 색을 지정하죠. 즉, 이미지, 동영상과 오디오, 문서파일 등등.

그리고, 특정 파일은 눈에 뛰게 강조하고 싶다면, 그런 파일은 따로 특이한 색상을 지정하면 되겠죠. 가급적 삼가는게 좋을 듯 싶네요.


현재 서술한 환경은 cygwin에서 테스트 한 것이므로 각자 환경에 맞지 않을 수도 있습니다. 그러나 대략적인 틀인 이 범주 안에서 적용될 거라 생각합니다.


간혹 아무리 ls에 "--color"를 넣어도 색상이 안보이는 경우도 있는데, 이는 환경 설정 문제보다는 자신의 터미널 설정에 문제가 많이 생기므로 기본 환경에서 터미널 설정을 살펴보세요.


이글이 도움이 되었으면 하는 바램이며, 도움이 되었다면, 댓글 정도 남겨주는 센스~~

끝.


덧글


시간이 된다면 지금 윈도우에서 사용하는 totalcommand의 색을 적용하려 합니다. LCD를 사용하고 있기에 배경을 흰색으로 설정해서 사용하는데... 쉘에서 흰색을 사용하면 뽀대가 안나는데.. ㅡ.ㅡ;

걍! 배경색만 검은 색으로 바꿔... 그래도 기본으로 그냥 변환해서 보기로 할까?


wincmd.ini 파일 내용중 일부
ColorFilter1=*.zip; *.ace; *.arj; *.lzh; *cab; *.tar; *.rar; *.ice;
ColorFilter1Color=10158235
ColorFilter2=*.sys; *.dll;
ColorFilter2Color=6250335
ColorFilter3=*.mp3; *.mp2; *.wav; *.ac3; *.wma
ColorFilter3Color=832740
ColorFilter4=*.ini; *.bak; *.log
ColorFilter4Color=4538020
ColorFilter5=*.cpp; *.java; *.c; *.css;
ColorFilter5Color=16744448
ColorFilter6=*.bmp; *.jpg; *.jpeg; *.gif; *.tif; *.png; *.psd;
ColorFilter6Color=2519354
ColorFilter7=*.avi; *.asf; *.rm; *.wmv; *.mpg; *.mpeg; *.vob;
ColorFilter7Color=45056
ColorFilter8=*.exe; *.msi;
ColorFilter8Color=2462464
ColorFilter9=*.hwp; *.doc; *.txt; *.hlp; *.smi; *.pdf;*.ini
ColorFilter9Color=8814641
ColorFilter10=*.htm; *.html; *.mht;
ColorFilter10Color=14836502
ColorFilter11=*.iso; *.ccd; *.bin; *.mdf;
ColorFilter11Color=5701806
ColorFilter12=>Directories
ColorFilter12Color=11867





참조
[1] Prompt Magic, Daniel Robbins, http://www.funtoo.org/en/articles/linux/tips/prompt/

[2] Getting Started with BASH, scott, http://www.hypexr.org/bash_tutorial.php

[3] COLORS-Lscolors, Bartman, http://linux-sxs.org/housekeeping/lscolors.html

[4] COLORS-Dircolors, Jerry McBride, http://linux-sxs.org/housekeeping/dircolor.html





반응형

'4.개발 및 운영 환경' 카테고리의 다른 글

Cygwin에서 resolv 라이브러리  (0) 2009.03.24
Socket에서 select사용하기  (2) 2009.01.15
[CUnit] C에서 Unit test 하기  (0) 2008.12.31
도스창 팁: Command Prompt Tip  (0) 2008.12.24
프로그래밍용 폰트  (0) 2008.12.11