다음 이전 차례

9. 약간의 프로그래밍

9.1 쉘 스크립트: 흥분제 먹은 .BAT 파일

긴 명령줄을 간단하게 쓰기 위해서 .BAT를 사용해본 적이 있으면(나는 아주 많다), profile이나 .bash_profile에 적절한 alias 행을 삽입함으로써 같은 목적이 얻어질 수 있다. 하지만 좀 더 복잡한 .BAT에 대해서는 쉘에서 사용 가능한 스크립트 언어를 아주 좋아할 것이다. 바로 강력한 QBasic이 그 중 하나다. 여기엔 변수와 while, for, case if... then... else같은 구조를 비롯하여 여러 가지 기능들이 있다: '진짜' 프로그래밍 언어의 좋은 대안이 될 수 있는 것이다.

스크립트---도스의 .BAT 파일에 해당하는 것---를 작성하는 것은 단지 인스트럭션들로 된 표준 ASCII 파일을 작성하한 다음 저장하고 chmod +x <스크립트파일>을 사용하여 실행 가능하게 만들어주면 된다. 실행하는 것은 이름을 입력하면 된다.

주의 할 점 한가지. vi라 불리는 시스템 편집기가 있는데 내 경험에 의하면 처음 사용하는 사람들은 매우 어려워한다. vi 편집기의 사용법에 대해서는 설명하지 않겠다. Matt Welsh의 책이나 인터넷에서 설명서를 찾아볼 것을 권한다. 여기서는 다음과 같은 것들을 언급하는 것으로 충분할 것 같다.

초보자를 위한 좋은 편집기는 joe이다: jstar를 입력해서 joe를 시작하면 DOSWin의 편집기와 똑 같은 키 바인딩을 사용할 수 있다. WordStar의 jed 또는 IDE는 더욱 좋다. "Where to Find Applicaions"섹션을 참조하면 어디에서 이들 편집기를 구할 수 있는지 나와있다.

bash의 스크립트를 작성하는 것은 매우 큰 주제이기 때문에 그 자체만으로도 책 한 권이 된다. 그래서 더 깊이 설명하지는 않겠다. 단지 기본적인 규칙을 깨달을 수 있는 쉘 스크립트 예제 몇 개를 보여주겠다:



#!/bin/sh
# sample.sh
# 나는 코멘트(주석)
# 첫번째 줄은 바꾸지 말 것 거기에 있어야 함
echo "이 시스템은: 'uname -a'" # 명령의 출력을 사용함
echo "내 이름은 $0" # 내장 변수
echo "당신은 다음을 주었음 $# 매개변수: "$*
echo "첫 번째 매개변수는: "$1
echo -n "이름은?" ; read your_name
echo 차이점을 잘 보자: "안녕 $your_name" # "로 인용문 넣기
echo 차이점을 잘 보자: '안녕 $your_name' # '로 인용문 넣기
DIRS=0 ; FILES=0
for file in 'ls .' ; do
        if [ -d ${file} ] ; then # file이 디렉토리라면
                DIRS='exr $DIRS + 1' # DIRS = DIRS + 1
        elif [ -f ${file} ] ; then
                FILES='expr $FILES +1'
        fi      case ${file} in
                *.gif|*jpg) echo "${file}: graphic file" ;;
                *.txt|*.tex) echo "${file}: text file" ;;
                *.c|*.f|*.for) echo "${file}: source file" ;;
                *) echo "${file}: genric file" ;;
        esac
done
echo " ${DIRS} 디렉토리와 ${FILES}가 존재한다"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # 마지막 코드 종료        
echo "ZxY--!!!WKW 못 찾음"
fi
echo "이상... 추가 정보가 필요하면 'man bash'를 입력할 것."

9.2 C 혼자 배우기

유닉스에서는 좋건 싫건 시스템 언어가 C다. 여러 다른 언어들(Java, FORTRAN, Pascal, Lisp, Basic, Perl awk...)도 사용할 수 있다.

C를 안다는 것을 가정하고 터보 C++ 등 도스용에 버릇이 나빠진 사람들을 위한 가이드를 몇 개 알려주겠다. 리눅스의 C 컴파일러는 gcc라고 불리며 DOS 용에 있는 수 많은 벨과 휘슬들이 없다. 다시 말해서 IDE, 온라인 도움말, 통합된 디버거 등이 없다. 그냥 거친 명령행 컴파일러일 뿐이며 아주 강력하고 효율적이다. 누구나 다 배우는 표준 hello.c를 컴파일 하려면 다음과 같이 입력한다.

        $ gcc hello.c

그러면 실행 가능 파일인 a.out이 만들어진다. 그 실행 파일에 다른 이름을 주려면 다음과 같이 입력한다.

        $ gcc -o hola hello.c                   
프로그램에 라이브러리를 링크하려면 -l<libname>를 스위치로 붙이면 된다. 예를 들어, math 라이브러리를 링크하려면 다음과 같이 한다:

        $ gcc -o mathprog mathprog.c -lm                        
( -l<libname> 스위치는 gcc로 하여금 라이브러리인 /usr/lib/lib<libname> 를 링크하게 만든다. so; so -lm은 /usr/lib/libm.so를 링크한다).

이제까지는 순조로웠다. 하지만 프로그램이 여러 개의 소스 파일로 만들어졌을 때는 유틸리티인 make를 사용해야 된다. 표현 해석기를 작성했다고 가정하자. 그 소스 파일을 parser.c 라고 부르고 parser.h와 calc.c 두 개의 헤더 파일을 #include 시킨다. 그런 다음 calc.c라고 하는 프로그램에서 parser.c에 있는 루틴을 사용하고 싶다고 하자. 그러면 순차적으로 parser.h가 #include 된다. 얼마나 복잡한가! calc.c를 컴파일 하려면 어떻게 해야 한단 말인가?

소위 Makefile이라고 풀리는 것을 작성해야 한다. 이는 컴파일러에게 소스들과 객체 파일들의 종속성을 알려준다.

예제에서:


# 이것은 Makefile로 calc.c를 컴파일 하는데 사용된다.
# 지시된 곳에서 <TAB> 키를 누른다!

calc: calc.o parser.o
<TAB>gcc -o calc calc.o parser.o -lm
# calc는 다음 두 개의 객체 파일에 의존한다: 

calc.o, parser.ocalc.o: calc.c parser.h
<TAB>gcc -c calc.c
# calc.o는 두 소스 파일에 의존한다

parser.o: parser.c parser.h xh.h
<TAB>gcc -c parser.c
# parser.o는 세 개의 소스 파일에 의존한다.

# Makefile의 끝

이 파일을 Makefile로 저장하고 make를 입력하여 프로그램을 컴파일 한다. 다른 방법으로 calc.mak로 저장한 다음 make -f calc.mak 라고 입력한다. RMP는 두말 할 필요도 없다. 다음과 같이 하면 man 페이지 섹션 3에 있는 C 기능에 대한 약간의 도움말을 불러올 수 있다.

        $ man 3 printf
프로그램을 디버깅하려면 gdb를 사용한다. gdb의 사용법을 알고 싶으면 info gdb라고 입력한다. 사용 가능한 라이브러리는 많이 있다. 그 중 제일 먼저 사용하고 싶은 것은 ncurse(텍스트 모드 효과)와 svgalib(콘솔 그래픽스)일 것이다. 한번 과감하게 X11 프로그래밍을 해보고 싶으면(그렇게 어려운 것은 아니다) X11 프로그래밍을 아주 쉽게 하도록 도와주는 라이브러리가 여럿 있다. Gtk가 리눅스의 표준이 되어가고 있다는 사실을 염두에 두고 www.xnet.com/~blatura/linapp6.html를 살펴보라.

많은 에디터들이 IDE 역할을 할 수 있다. 그 예로 emacs와 jed가 있는데 신택스 하이라이트, 자동 들여쓰기 등의 기능이 있다. 다른 것으로는 sunsite.unc.edu:/pub/Linux/devel/debuggers/ 에서 rhide 패키지를 가져온다. 이것은 Borland IDE 클론으로 아마 좋아할 것이다.


다음 이전 차례