메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

유닉스를 말한다, Part 1: 명령어의 힘 (한글)

유닉스 유틸리티를 혼합하여 즉석 프로그램 구현하기

Martin Streicher , Editor-in-Chief, Linux Magazine
Martin Streicher는 Linux Magazine의 편집장이며, Hesketh.com에서는 웹 개발자로, developerWorks의 기고자로 활동하고 있다. 퍼듀대학교에서 컴퓨터 공학 석사 학위를 받았으며, 1996년부터 유닉스 계열 시스템을 프로그래밍 하고 있다.
(An IBM developerWorks Contributing Author)

요약:  유닉스 쉘의 기초를 배우고, 명령어를 사용하여 유닉스 유틸리티 세트를 수 많은 데이터와 결합하는 방법을 배워봅시다.

이 연재 자세히 보기

원문 게재일:  2007 년 9 월 04 일
난이도:  초급 영어로:  보기
페이지뷰:  2543 회
의견:  


Speaking UNIX: Hello, shell

유닉스® 시스템에서 가장 고급스럽고 차별화 되는 기능 중 하나는 명령어(command line)이다. 약간의 "글루(glue)"를 포함한 키워드를 통해, 명령어를 사용하여 유닉스 유틸리티를 수 많은 즉석 데이터 변형들과 결합할 수 있다.

예를 들어, 현재 실행 디렉토리에 기반한 폴더 계층에서 고유한 파일 이름 리스트를 찾으려면, 쉘 프롬프트에서 다음을 입력한다.

                find . -type f -print | sort | uniq
            

이 명령어는 세 개의 개별 유틸리티를 결합한다.

  • find는 네임드 디렉토리(이 경우, . 또는 dot으로 시작하는 파일 시스템)의 깊이(depth)를 재고, 기준에 맞는 모든 엔트리들의 이름들을 방출(emit)한다. 여기에서, -type ffind가 플레인 파일들만 발견하도록 명령한다.

  • sort는 말 그대로 리스트를 처리하고 알파벳 순으로 정렬된 새로운 리스트를 방출한다.

  • uniq ("유니크(unique)"라고 읽음)는 리스트를 검사하고, 리스트에 있는 인접 엘리먼트들을 비교하고 중복을 제거한다. 다음과 같은 리스트를 생각해 보자.



    Listing 1. 예제 리스트
                            Groucho
    Groucho
    Chico
    Chico
    Groucho
    Harpo
    Zeppo
    Zeppo
    

    uniq는 이 리스트를 다음과 같이 줄인다.



    Listing 2. uniq 명령어
                            Groucho
    Chico
    Groucho
    Harpo
    Zeppo
    

    Marx Brothers의 원래 리스트가 먼저 정렬된다면(모든 이름의 순서를 연속 실행으로 재조정 하면) uniq를 실행할 경우 다음과 같은 결과가 나온다.



    Listing 3. uniq 실행하기
                            Chico
    Groucho
    Harpo
    Zeppo
    

find, sort, uniq에 대한 추가 정보는 유닉스 시스템 상의 각 유틸리티 man 페이지를 참조하라.


Data in, data out, data all about

독립적으로 사용되는 find는 인풋 데이터로서 파일 시스템의 콘텐트를 취한다. 하지만, sortuniq표준 인풋 장치(input device) (stdin)에서의 데이터 엔트리 또는 인풋을 필요로 한다. 키보드를 사용하여 stdin을 제공하게 된다. 라인으로 정렬된 데이터를 입력한다.

기본적으로, find는 결과를 표준 아웃풋 장치(standard output device) (stdout)로 출력하는데, 이는 주로 터미널 윈도우이다. sortuniq는 결과를 stdout에 출력한다.

stdin과 stdout에 대해 알아보려면, 터미널 윈도우에 다음 텍스트를 입력한다. (선행하는 퍼센트 문자 (%) 는 쉘 프롬프트이다.)


Listing 4. stdin과 stdout
                % sort
mustache
horn
hat
Control-D
            

sort는 stdin에서 여러분이 입력했던 세 줄을 읽고, 이들을 정렬하고, 결과를 stdout에 작성한다. 그림 1sort의 실행 개념도이자, 대부분의 유닉스 명령어 유틸리티 개념도이다.


그림 1. 전형적인 유닉스 명령어 유틸리티는 stdin에서 읽고 stdout에 작성한다.
유닉스 명령어 유틸리티

find 같은 일부 유틸리티는 stdin에서 읽지 않는다. 대신, 파일 시스템 또는 파일 커널 같은 시스템 리소스에서 처리하고, 결과를 stdout에 작성한다. find가 작동하는 방법을 그림 2처럼 묘사했다.


그림 2. 일부 유틸리티는 시스템 리소스에서 데이터를 읽고 결과를 stdout에 작성한다.

stdin과 stdout을 사용하는 것 외에도, 유닉스 명령어는 진단용으로 예비해 둔 특별한 아웃렛에 에러 메시지를 방출할 수 있다. 이 아웃렛을 표준 에러 장치(standard error device) (보통은 stderr라 함)라고 한다. 그림 3은 이 유틸리티를 실행하는 간단한 명령어를 묘사하고 있다.


그림 3. 유닉스 명령어는 표준 채널인 stderr에 에러를 방출한다.

그림 3에서 보듯, 대부분의 유닉스 명령어들은 터미널에서 인풋을 읽고, 결과를 터미널로 보내고, 에러를 터미널에 출력한다. 기본적으로, 그리고 달리 지정하지 않는 한, 터미널은 stdin의 소스가 되고 stdout과 stderr의 목적지가 된다.


트래픽 라우팅 하기

stdin의 소스와 stdout과 stderr의 최종 목적지를 바꿀 수 있다. stdin이 텍스트 파일, 장치(컴퓨터로 연결된 프로브), 네트워크 연결에서 읽을 수 있도록 할 수 있다. 아웃풋을 파일, 장치, 연결로 보낼 수 있다. 유닉스에서, 모든 것이 하나의 파일일 경우, 하나의 소스나 목적지는 다른 것들과 마찬가지로 소비 또는 생산하기가 쉽다.

프로세스 데이터의 소스와 목적지를 바꾸는 것을 리다이렉션(redirection)이라고 한다. stdin을 리다이렉트 하여 파일 또는 다른 소스에서 데이터를 읽을 수 있다. stdout과 stderr를 (개별적으로) 리다이렉트 하여 터미널 윈도우 외 다른 곳에서 데이터를 작성할 수 있다. 많은 경우, 앞서 보여준 원래의 find 명령어에서처럼, 유틸리티를 리다이렉트 하여 다른 유틸리티에서 데이터를 소비 및 생산할 수 있다. 이것은 파이프(pipe) (|)의 목적이다. 명령어에서, 파이프를 사용하여 프로세스들을 연결(daisy-chain)하면서, 한 명령어의 데이터를 다음 명령어로 보낸다. 히터에서 싱크로 물을 보내는 동 파이프와 같은 원리이다.

그림 4find . -type f -print | sort | uniq 명령어의 개념도이다.


그림 4. 파이프에 의해 연결된 세 개의 유틸리티의 개념 모델

find의 stdout은 uniq의 stdin이 된다. uniq의 stdout은 sort의 stdin이다. 마지막으로, sort는 결과를 표준 아웃풋 장치로 출력하는데, 이것은 터미널로 연결되어 있다. 이 명령어의 stderr는 리다이렉트 되지 않았기 때문에 세 개의 모든 유틸리티들은 터미널에 에러 메시지를 프린트 한다. (세 개의 유틸리티에서 온 에러 메시지들은 혼합되지만, 메시지 순서는 정확하다.)

필요할 경우, 위에 보인 파이프라인을 확장하여 uniq의 아웃풋을 또 다른 유틸리티로 리다이렉트 할 수 있다. 또 다른 파이프에 붙어서 변형을 더욱 확장한다. 예를 들어, | less를 붙여서 less를 사용하여 아웃풋에 페이지 수를 매기거나, | wc -l을 추가하여 고유 파일 이름을 찾는다. (wcword count의 약자이다. wc는 문자, 단어, 라인들을 카운트 할 수 있다.)

>를 사용하여 전체 시퀀스의 아웃풋을 파일에 저장할 수 있다. (파일의 기존 콘텐트를 제거한다.) 또한, >>를 사용하여 결과를 기존 파일에 붙인다. (없다면 파일을 만든다.)

또 다른 유용한 리다이렉션으로 <가 있다. 그림 5는 stdin이 리다이렉트 되어 파일로부터 읽는 방법을 보여준다. sort 명령어는 네임드 파일에서 단어 리스트를 읽고 이를 알파벳 순으로 정리한다.


그림 5. 표준 인풋을 리다이렉트 하여 파일에서 읽기

stdout과 stderr를 캡쳐할 수 있다. 예를 들어, 대형 데이터 마이닝 태스크를 실행한다면, 중간 아웃풋과 실행 동안 발생한 에러를 검토해야 한다. 리다이렉션 신택스를 사용하여 이를 수행한다. |&, >&, >>&, pipe, create, append stdout과 stderr를 동시에 수행한다. 그림 6은 stdout과 stderr가 결합하여 하나의 아웃풋 스트림을 만드는 방법을 보여주고 있다.


그림 6. 표준 아웃풋과 표준 에러 장치 결합하기


Z shell

대부분의 현대적인 유닉스 쉘(Bourne shell (bash)과 Korn shell (ksh))은 리다이렉션을 지원하지만, 이러한 쉘에서 필요로 하는 특정 신택스는 약간 다르다. (각각의 쉘 문서를 참조하라.)

대부분의 리다이렉션 연산자들은 25년 동안 모든 유닉스 쉘의 일관된 특징이었다. 하지만, 이러한 쉘 대부분이 혁신을 이루지 못했고 리다이렉션을 적용하는 새로운 방법을 찾지 못하고 있다. 예를 들어, 대부분의 쉘은 하나의 파일에서 인풋만 리다이렉트 하고, 여러분은 tee 같은 유틸리티를 사용하여 한 개 이상의 목적지에 출력할 수 있다. (배관공이 사용하는 티(tee) 연결과 마찬가지로, tee는 하나의 인풋과 두 개의 아웃풋을 갖고 있다.) 다음은 bash를 쉘로서(명령어 인터프리터) 사용한 예제이다.


Listing 5. bash 예제
                
bash$ ls
tellme
bash$ cat tellme
echo Your current login, working directory, and system are...
whoami
pwd
systemname
bash$ bash < tellme |& tee log
Your current login and working directory are...
strike
/home/strike
bash: systemname: command not found
bash$ ls
tellme log
bash$ cat log
Your current login and working directory are
strike
/home/strike
bash: systemname: command not found

유닉스 쉘은 고도로 특화되어 있고 키보드를 사용하여 대화식으로 사용된다. bash 같은 쉘은 파일에서 인풋을 읽는다. (결국, stdin은 하나의 파일일 뿐이다.) 이전 스니펫에서, bash < commands 구문은 bash가 tellme 파일에서 찾은 명령어 리스트를 실행하게 한다. |&tee log 구문은 bash의 stdout과 stderr를 tee 유틸리티로 연결하는데, 이것은 stdin을 stdout 파일 로그로 출력한다.

bash가 한 개 이상의 인풋 파일을 처리하도록 하고 싶다면? cat file1 file2 file3 | bash가 사용 가능한 솔루션이자, 유일한 솔루션이다. bashbash < file1 < file2 < file3 같은 신택스를 지원하지 않는다.

더욱이, bash는 아웃풋을 한 개 이상의 목적지로 아웃풋을 리다이렉트 할 수 없다. 예를 들어, bash 명령어에서 bighairyscript > ~/log | mail -s "Important stuff" team 같은 명령어를 입력할 수 없다.

하지만, 비교적 새로운 쉘인 Z shell(zsh; 참고자료)은 같은 명령어에서 다중 인풋과 아웃풋 리다이렉션을 처리할 수 있다. 다음은 로그라고 하는 파일에 stdout을 저장하고 이를 이메일을 사용하여 보내는 명령어 예제이다.


Listing 6. Z shell
                
zsh% bash < tellme > log | mail -s "Who you are" 'whoami'
bash: line 4: systemname: command not found
zsh% <log
Your current login, working directory, and system are...
strike
/home/strike

('whoami'whoami 명령어를 실행하고 구문 대신에 그 명령어 결과를 삽입한다. 이것은 나머지 명령어가 실행되기 전에 작은 쉘 명령어를 실행하는 것과 같다.)

명령어를 왼쪽에서 오른쪽으로 살펴보자. bash 명령어는 파일 로그를 만들고 tellme에서 찾은 명령어의 stdout을 메일로 보낸다. stderr는 > 또는 파이프에 의해 리다이렉트 되지 않았기 때문에, 에러 메시지가 stdout으로 프린트 된다. <log 명령어는 또 다른 Z shell이다. cat과 같다. (> file 명령어는 cat > file과 같다.)

Z shell은 한 개 이상의 인풋 리다이렉션도 처리한다. Z shell 명령어 cat < file1 < file2 < file3cat file1 file2 file3과 같다. 익히 알려진 대로, 전자 신택스는 후자 보다 광범위하지 않고, 다중 stdout 리다이렉션이 훨씬 자주 사용된다. 하지만, 여러분이 실행하고자 하는 유틸리티가 다중 인풋 인자를 허용하지 않으면, Z shell의 다중 인풋 리다이렉션이 편리하다.

Z shell은 globbing (와일드카드 매치), 고급 패턴 매치, 명령어에서 입력해야 할 것을 줄여주는 자동 완성 시스템 같은 더 많은 트릭들로 가득하다. 본 시리즈의 다음 기술자료에서 Z shell에 대해 자세히 다루도록 하겠다.


쉘 트릭

다음은 보다 생산성 있는 강력한 명령어 조합들이다. 이 명령어는 zsh 뿐만 아니라 모든 쉘에서 작동한다.

  • tar를 사용하여 심볼릭 링크를 포함하여 똑 같은 디렉토리 카피를 만든다.

    tar cf - /path/to/original |  \
      (mkdir -p /path/to/copy; cd /path/to/copy; tar xvf -)
    

    첫 번째 tar는 /path/to/original 디렉토리를 압축하고 이 압축 파일을 stdout에 방출한다. create (c) 옵션과 함께 사용된 하이픈 (-)은 stdout을 지정한다. 괄호 안에 있는 명령어는 하위 쉘이다. mkdir -p는 중간 디렉토리들을 포함하여 네임드 디렉토리를 만든다. cd는 새로운 디렉토리로 바뀐다. 두 번째 tar는 stdin에서 압축 파일을 읽고 이를 알맞은 장소에 추출한다. extract (x) 옵션과 함께 사용된 하이픈은 stdin을 의미한다.

  • 명령어 시퀀스의 stdout을 저장하고 이를 동시에 보려면, less -O file 을 사용한다. -O 옵션은 stdin을 네임드 file 에 복사한다.

    sort /etc/aliases | less -Osorted
    

  • 디렉토리에 수 천 개의 파일들이 포함되어 있다면, 쉘(zsh 포함. 파일의 수와 파일 이름에 기반함)은 와일드카드 매치를 사용하여 모든 파일들을 열거할 수 없다. 이 명령어는 특정 문자 수로 제한되기 때문이다. 따라서, 다음과 같은 쉘 스크립트 구문은

    foreach i (*)
    ...
    end
    

    실패할 것이다. (명령어 길이를 초과하면 Line length exceeded 같은 메시지를 보게 될 것이다.) 이 같은 에러가 발생하면, 파이프와 xargs 유틸리티를 사용한다. xargs는 파이프에서 데이터를 읽고, 모든 라인에 지정된 명령어를 실행한다.

    예를 들어, www.example.com을 참조하는 서버에서 모든 웹 페이지들을 찾으려면, 다음 명령어를 사용한다.

    % find / -name '*html' -print \
      | xargs grep -l 'www.example.com' \
      | less -Opages
    
                        

    xargsfind에서 파일 이름을 사용하고 grep -l을 반복적으로 실행하여 모든 파일을 처리한다. 네이밍 된 파일이 얼마나 많은지는 상관이 없다. (grep -l은 매치를 찾으면 파일의 이름을 출력하고, 그 파일에서 더 많은 매칭을 중지한다.) less를 사용하여 결과로부터 페이징을 할 수 있고 파일 페이지에 리스트를 저장한다. 결과는 "www.example.com" 이라는 스트링을 포함하고 있는 파일 이름 리스트일 것이다.


여행이 시작되었다.

이 글에서, 유닉스 쉘의 기초를 배웠다. 다음 기술자료에서는 여러분이 사용할 수 있는 명령어 툴과 기술에 대해 보다 자세히 설명하도록 하겠다. 파일 시스템에서 전체 로컬 영역 네트워크까지, 거의 모든 정보와 시스템 관리는 유닉스 명령어를 통해 효율적으로 수행될 수 있다.

다음 편을 기대해 주기 바란다!


참고자료

교육

제품 및 기술 얻기

토론

필자소개

developerWorks Contributing author level

Martin Streicher는 Linux Magazine의 편집장이며, Hesketh.com에서는 웹 개발자로, developerWorks의 기고자로 활동하고 있다. 퍼듀대학교에서 컴퓨터 공학 석사 학위를 받았으며, 1996년부터 유닉스 계열 시스템을 프로그래밍 하고 있다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=AIX와 UNIX
ArticleID=253053
ArticleTitle=유닉스를 말한다, Part 1: 명령어의 힘 (한글)
publish-date=09042007
author1-email=martin.streicher@linux-mag.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.