(미완성)평범한 개발자의 C 프로그래밍 이야기

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

터미널 환경 꾸미기

리눅스에서 프로그래밍을 하려면 가장 먼저 실행해야할 프로그램은 무조건 터미널이지요. 터미널을 가지 입맛에 꾸미는 것이 가장 기본이 될것 같습니다.

언어 인코딩 설정, 터미널 설정, 쉘 프롬프트 등 기본적인 사용 환경 설정부터 환경 변수, 라이브러리 경로 등 개발이나 프로그램 동작에 필요한 설정들이 bashrc에 저장됩니다. 제품이 특정 플랫폼에만 동작한다면 굳이 세세하게 관리할 필요가 없을 수 있지만, 다양한 플랫폼에 적용되는 제품을 개발해야하고 다양한 플랫폼에 접속해서 테스트해야한다면 모든 플랫폼에서 동일하게 사용되는 bashrc를 준비하는게 더 편리합니다.

예를 들어, 제가 실제로 경험한 일인데 쉘 프롬프트의 포맷을 설정하지 않고 시스템 디폴트 값으로 사용할 때의 일입니다. 어떤 유닉스 머신이 프롬프트를 #로 쓰고 있었고, 제 노트북의 리눅스는 사용자 ID와 호스트이름, $ 등을 프롬프트로 사용하고 있었습니다. 여러개의 터미널을 실행해서 한 터미널에서는 유닉스에 접속해서 쓰고, 한 터미널은 리눅스에 접속해있었습니다. 짐작하셨겠지만 리눅스 터미널에서 root로 접속한 다음, 해서는 안될 짓을 했습니다. /lib 밑에 있는 라이브러리를 지워서 순간 덜컥했던 일이 있었습니다. 그나마 제 노트북에서 그런 짓을 했으니 다행이지요. IDC에 있는 머신에 접속해서 시스템 파일을 지우시거나 네트워크를 제부팅하시는 등의 실수담이 자주 이야기됩니다. 한밤중에 사무실이나 집에서 IDC로 뛰어가서 작업해야되는 것이지요. 결국 저는 제가 작업하는 모든 플랫폼이 동일한 프롬프트를 가지게 했습니다. ID는 항상 같으니 호스트네임과 상대 경로를 프롬프트로 설정하니 플랫폼이 헷갈리는 일이 없어졌습니다.

이제 환경 관리를 위한 파일들을 작성해보겠습니다.

가장 기본이 되는 bashrc를 만들어보겠습니다. 사실 bashrc에 대한 내용은 너무나 방대합니다. 게다가 플랫폼에 따라 다르기도 하기 때문에, 사용자가 사용하면서 필요에 따라 늘 수정해나가게 됩니다. 문제가 생기거나 필요한 기능이 생길때마다 검색해보거나 GNU 홈페이지의 bash 메뉴얼을 찾아보아야 합니다. 저는 제가 사용하는 기능 중 몇가지만 소개하겠습니다. 조금이라도 뭔가 불편한게 느껴지시면 메뉴얼을 보시는 습관을 들으시면 좋은것 같습니다. 경험상 99%는 이미 누군가 해결해놓았고, 쉽게 큰 편리함을 누릴 수 있게됩니다. 불편함을 참거나 불편함을 못느끼고 늘 쓰던데로만 쓰면 개발 효율이 떨어지고, 결국 저만 손해보는것 같습니다.

전체 파일을 보기 전에 몇가지 중요한 변수들을 알아두면 좋을것 같습니다. 다음 리스트를 눈여겨 보시기 바랍니다.

- PS1: 쉘 프롬프트의 모양을 설정하는 환경변수입니다. 각 플랫폼마다 기본으로 사용되는 쉘이 있고, 기본적인 프롬프트가 있습니다. 하지만 이 변수를 설정해서 모든 플랫폼이 공통 포맷을 가지도록 하면 편리합니다. 그리고 나중에 사용할 emacs의 tramp 모드가 동작하기에도 좋습니다.
- HOSTNAME: 환경 변수는 아니고 hostname 명령어를 사용해서 알아낸 값을 저장한 변수입니다. 이 값에 따라 현재 플랫폼이 무엇인지 알수 있습니다.
- OS: 이 변수도 환경 변수가 아닙니다. uname 명령어로 알아낸 운영체제 이름을 저장한 변수입니다.
- LANG: 터미널의 언어를 설정합니다. 운영체제마다 설정할 수 있는 값이 다르기때문에 주의해야합니다. 같은 utf-8 인코딩을 사용한다고해도 어떤 운영체제는 UTF-8이라고 표시하고, 어떤 운영체제는 utf8 이라고 표시할 수 있습니다. 따라서 OS 변수를 확인해서 운영체제마다 다른 값으로 설정해야합니다.
- PATH: 실행 파일이 저장된 경로를 저장하는 환경변수입니다. 모든 플랫폼에서 같은 값이면 편리하겠지만 사실상 그러기 어렵습니다. 예를 들어 플랫폼마다 gcc를 설치한 경로가 다를 수 있습니다. 또 플랫폼마다 사용하는 gcc 버전이 다를 수도 있습니다. /opt/gcc-4.3.4/bin 에 있는 gcc를 사용할 수도 있고, /usr/bin/gcc-3.4.4/bin 에 있는 gcc를 사용할 수도 있습니다. 결국 운영체제와 호스트네임별로 따로따로 설정해야하는 값입니다.
- LD_LIBRARY_PATH: 공유 라이브러리의 경로를 저장하는 환경변수입니다. 플랫폼마다 라이브러리가 설치된 경로가 다를 수 있으므로 운영체제와 호스트네임별로 다른 값이 될 수 있습니다.
- 기타 터미널 설정: alias, LS_COLORS, ixany 등을 예제 파일에서 사용할 것입니다. 간단하게 검색하면 쉽게 이해할 수 있습니다.

기본적인 변수에 대해서 이해했다면 다음 예제 파일을 보시기 바랍니다.


export HOSTNAME=`hostname`
export OS=`uname`
#########################################################
# PROMPT
#########################################################
export PS1="\[\033[31m\]\u@\h:\w\$ \[\033[0m\]"
#########################################################
# LS_COLORS
#########################################################
# full support for all
if [ "$OS"=="Linux" ]; then
 export LS_COLORS='rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36'
else
 export LS_COLORS=':di=01;34:ex=01;32:ln=01;36'
fi
if [ "$TERM" != "dumb" ] && [ "$OS" == "Linux" ]; then
    alias ls='ls --color=auto'
    alias grep='grep --color=auto'
else
    alias ls='ls -F'
fi

#########################################################
# language
#########################################################
if [ "$OS" == "SunOS" ]; then
    export LANG=ko_KR.UTF-8
elif [ "$OS" == "AIX" ]; then
    export LANG=en_US
else
    export LANG=ko_KR.utf8
fi

###############
# PATH
###############
if [ "$OS" == "HP-UX" ]; then
    PATH=/usr/local/bin:/opt/hp-gcc64/bin:$PATH
elif [ "$OS" == "SunOS" ]; then
    PATH=/usr/local/bin:/opt/SUNWspro/bin:$PATH
elif [ "$OS" == "AIX" ]; then
    PATH=/usr/vac/bin:/usr/vacpp/bin:$PATH:/usr/local/bin
else
    PATH=/usr/local/bin:$PATH
fi

###############
# LD_LIBRARY_PATH
###############
if [ "$HOSTNAME" == "AIX-5.4" ]; then
    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
elif [ "$HOSTNAME" == "HP-UX-10.1" ]; then
    export LD_LIBRARY_PATH=/usr/local/lib:/usr/sfw/lib:$LD_LIBRARY_PATH
fi

#############
# for My Project Development
#############
export MY_PROJECT_HOME=${HOME}/work/my_project/trunk
export MY_PROJECT_PORT_NO=21138
if [ "$OS" == "HP-UX" ]; then
    export JAVA_HOME=/opt/java1.4
elif [ "$OS" == "SunOS" ]; then
    export JAVA_HOME=/usr/java
elif [ "$OS" == "AIX" ]; then
    export JAVA_HOME=/usr/java14
elif [ "$OS" == "Linux" ]; then
    export JAVA_HOME=$HOME/work/j2sdk1.4.2_19
fi

대부분의 설정들이 플랫폼마다 다르므로, 가장 먼저 플랫폼의 종류를 알아내야 합니다. 그래서 예제 파일에서는 가장 먼저 HOSTNAME과 OS 변수를 설정했습니다.

다음은 프롬프트 설정입니다. PS1은 프롬프트에 출력될 내용을 설정하는 특수 문자들로 구성됩니다. 몇가지 자주 사용되는 특수 문자들의 설명을 보시겠습니다.


\d 날짜

\h 호스트네임

\n 다음 줄로 넘어감

\r 라인의 시작 캐리지 리턴

\u 사용자 ID

\w ~로 시작하는 현재 디렉토리의 절대 경로

\W 현재 위치한 디렉토리의 이름만 출력함

\nnn 8진수의 아스키 코드

\\ 백슬래쉬

\[ 프롬프트 설정을 위한 문자들의 시작 표시

\] 프롬프트 설정 문자들의 끝 표시

 

"\[\033[31m\]\u@\h:\w\$ \[\033[0m\]"

PS1은 \[\033[31m\]으로 시작된다. 따라서 \033[31m은 출력할 메시지가 아닌 설정 값이라는 의미입니다. 8진수 033은 아스키코드로 ESC를 의미하는데 이 것은 다음에 출력할 메시지의 색상을 지정한다는 의미이고 m은 색상값 지정이 끝난다는 의미입니다. 따라서 31이 색상값입니다. 31은 빨간색을 말하므로 \u부터 \$까지 모든 메시지를 빨간색으로 출력하게 됩니다. 프롬프트 마지막에 다시한번 색상값 설정이 나오는데 값이 0이므로 시스템 디폴트 값이 됩니다. 만약 프롬프트 마지막의 색상값 설정이 없다면 사용자가 입력할 문자들도 빨간색으로 출력됩니다.

 

참고로 몇가지 색상값을 적겠습니다.

 

0 = 기본값 1 = 볼드체 4 = 밑줄 5 = 점멸 7 = 역상
31 = 빨강 32 = 초록 33 = 오렌지 34 = 파랑 35 = 자주 36 = 청록 37 = 회색
40 = 검정 배경
41 = 빨강 배경
42 = 초록 배경
43 = 오렌지 배경
44 = 파랑 배경
45 = 자주 배경
46 = 청록 배경
47 = 회색 배경
90 = 진회 색
91 = 연빨강
92 = 연두 93 = 노랑 94 = 연한 파랑 95 = 연한 자주 96 = 하늘색
100 = 진회색 배경
101 = 연한 빨강 배경
102 = 연두 배경
103 = 노랑 배경
104 = 연한 파랑 배경
105 = 연한 자주 배경
106 = 하늘색 배경


다음으로 LS_COLORS 값을 알아보겠습니다. LS_COLORS 설정의 형태는 "파일종류=속성;색:파일종류=속성;색..." 입니다. 파일 종류에 따라 다른 색상을 지정할 수 있습니다. 파일 종류는 "*.확장자"와 같이 특정 확장자를 지정할 수도 있고, 다음과 같이 미리 지정된 파일 형태를 지정할 수도 있습니다.

fi - 일반 파일
di - 경로
ln - 심블릭 링크
pi - FIFO(파이프)
so - 소켓
bd - 블럭 장치
cd - 캐릭터 장치
ex - 실행 파일 

속성은 다음과 같이 설정할 수 있습니다.

0 = 기본값
1 = 볼드체
4 = 밑줄
5 = 점멸
7 = 역상


색깔 설정은 프롬프트와 같습니다.

저는 제가 가진 리눅스 머신에서 영화를 보거나 음악을 들으므로 다양한 멀티미디어 파일의 색깔을 지정해놓았습니다. 리눅스를 처음 설치하고 LS_COLORS를 출력하면 이와 비슷한 값일 것입니다. 그 외에 다른 개발 플랫폼에서는 개발에 관련된 일만 하므로, 개발 관련 파일들의 색상만 설정하면 될 것입니다. 리눅스의 LS_COLORS 설정에서 필요한 것들만 복사해서 설정해놓았습니다.

다음으로 alias를 사용해서 ls 명령의 디폴트 옵션을 설정했습니다. 리눅스에서는 파일들의 색상이 다양하게 출력되도록 합니다. 그리고 다른 개발 플랫폼에 접속했을때는 컬러 터미널이 아닌 경우가 많으므로 -F 옵션을 주어서 파일 종류에 따라 링크 파일이면 @ 표시, 디렉토리이면 /표시 등이 같이 출력되도록 합니다.

그 다음은 플랫폼에 따라 다르게 설정되는 값들입니다. HOSTNAME과 OS 변수를 이용해서 플랫폼마다 다르게 환경을 설정할 수 있습니다. 각 변수들의 의미는 위에서 설정했으므로 다시 설명하지 않겠습니다. 플랫폼에 따라 if, elif 등을 사용하는 방법을 눈여겨 보시기 바랍니다.

이 파일은 예제일 뿐이고, 실제로는 개발 프로그램이 필요로 하는 많은 환경 변수들을 bashrc에 설정합니다. 항상 플랫폼마다 다른 환경을 하나의 bashrc로 관리하도록하면 편리합니다.

구글 프로젝트나 github등에 자기 계정을 만들고 bashrc 등의 환경 설정 파일을 모아놓고 회사나 집에서 필요할때마다 다운받아서 쓰면 좋습니다.

댓글

댓글 본문
작성자
비밀번호
  1. 달빛낙원애청자_윤석찬
    허거걱.. 저는 제 스스로 리눅스를 잘 다룬다고 생각했었는데, 뭔 말인지 이해가 되지 않을 정도로 공부가 부족한 상황이었네요.. 좋은 강의 정말 감사합니다.
  2. gurugio
    예제 파일입니다.
    https://github.com......ple
버전 관리
gurugio
현재 버전
선택 버전
graphittie 자세히 보기