Speaking UNIX: man의 유용한 기능

UNIX man 페이지 시스템 안내

Martin Streicher, Web developer,

요약: UNIX?玲〈? 너무나 많은 명령이 있어서 이와 관련된 모든 옵션과 그 의미를 기억하는 것은 불가능합니다. 그러나 다행히도 UNIX에는 온라인 참조 시스템인 man이 있어서 그렇게 하지 않아도 됩니다.

이 연재 자세히 보기

UNIX 명령행에서 사용할 수 있는 명령이 셀 수 없이 많고(대략 1,500개를 상회) 각 명령에는 다양한 기능이 있어서 이와 관련된 모든 옵션과 의미 등을 기억하는 것은 불가능하다. 불행히도 UNIX 명령은 40년 동안 서서히 발전해 왔기 때문에 엄격한 규정이 거의 없다. 예를 들어, -lls에서 "긴 형식"을 의미하지만, 기타 파일 유틸리티에서는 이 옵션을 사용할 수 있다고는 해도 그 의미가 다르다. 더욱이 간단한 사용 방법을 표시하는 옵션인 --help를 일부 명령행 프로그램에서 지원하고는 있지만 모두 그런 것은 아니다. 명령행은 기능이 강력한 만큼 배우려면 많은 노력이 필요하다.

적어도 처음에는 그렇다. 시간이 지나면 어떠한 기술을 배울 때와 같이 자주 사용하는 명령은 자동으로 기억되어 본능적으로 다룰 수 있게 된다. 게다가 사용하는 쉘에 따라 자주 사용하는 명령행 조합을 별명이나 쉘 스크립트로 커미트하여 기억에 대한 부담을 줄일 수 있다. 또한 일부 쉘은 세션 전체에서 이전에 사용한 명령을 기록한 긴 히스토리를 유지한다.

이 때문에 메모리가 줄어들고 새로운 문제가 발생한다. 명령행 을 완벽하게 마스터하기 위해 man과 싸울 수는 없다. man 시스템은 UNIX에 내장된 온라인 참조 시스템이기 때문이다. 사실상, 오랫동안 UNIX 커뮤니티에서는 가장 혼란스러운 문제를 처리할 경우에는 "RTFM(Read the frickin' man page!)이라는 구호를 외치곤 했다.

man 시스템

UNIX man 시스템은 온라인 문서 콜렉션과 문서 판독기, 이렇게 두 부분으로 구성되어 있다. 각 문서는 man 페이지라고 하고 주제에 따라 man 페이지는 매우 간략하거나 길다. 문서 판독기는 간단한 명령행 유틸리티이며 man이라고 한다.

시스템에 설치한 소프트웨어의 문서를 읽으려면 간단히 man 구성요소를 입력하며 여기서 구성요소는 소프트웨어의 이름이다. 예를 들어 ls 유틸리티에 관한 문서를 읽으려면 다음과 같이 입력한다.

$ man ls

다음과 같이 man 자체에 관한 문서를 읽을 수도 있다.

$ man man

구성요소를 설치했고 man 페이지가 있는 경우 ls에 대한 man 페이지가 그림 1과 같이 표시된다. 지정한 man 페이지가 존재하지 않는 경우 manNo manual entry for component를 표시한다. (이름을 지정하지 않고도 해당 man 페이지를 찾을 수 있는 다른 기술이 있다. 게다가 매우 빨리 찾을 수 있다.)


그림 1. 터미널 창에서 실행 중인 man 문서 판독기
man 문서 판독기

각 명령행 유틸리티, 시스템 호출, 호출 가능한 프로그래밍 라이브러리 함수 및 각 파일 형식과 같은 중요한 모든 소프트웨어에는 일반적으로 보완적인 man 페이지가 있다. 실제로 새로운 소프트웨어를 빌드하는 경우 man 페이지를 작성하여 제공하는 것이 일반적이다.

man 페이지는 통상 /usr/man에 저장되었다. 정확한 위치는 UNIX 벤더마다 다를 수 있지만, 최근에는 저장 위치가 /usr/share/man으로 변경되었다. 또한 소프트웨어 패키지의 man 페이지가 소프트웨어의 루트 디렉토리 아래의 서브디렉토리에 저장되는 경우는 드물다. 즉, MySQL 데이터베이스 엔진의 일부 릴리스는 man 페이지가 /usr/local/mysql/man에 저장되어 있다. man 페이지를 다양한 저장소에 할당하는 경우 일부 구성을 변경해야 하지만 이러한 모든 설정이 가능하다.

man 페이지의 위치에 관계없이 각 저장소는 하나 이상의 섹션으로 세분된다. 각 섹션은 독립된 서브디렉토리로 구현되며 규칙에 따라 이름이 지정된다. man1, man2를 비롯하여 man8까지 있으며 각각은 명령 클래스를 표현한다. 표 1에는 섹션 이름과 해당 내용이 표시되어 있다.


표 1. Man 저장소 섹션 및 해당 내용
섹션내용
man1일반 명령. 일반적으로 이 섹션에 있는 명령에는 수퍼 사용자나 관리 특권이 필요 없다. ls, catpasswd가 쉘과 마찬가지로 이 범주에 속한다. man bash를 실행해서 확인해 볼 수 있다.
man2UNIX 커널에서 제공하는 서비스를 액세스하는 시스템 호출 또는 함수. 기존 프로세스에서 새로운 프로세스를 생성하는 fork 시스템을 예로 들 수 있다. man fork를 실행하면 해당 man 페이지가 표시된다. 시스템 소프트웨어를 담당하는 프로그래머가 이 섹션을 자주 참조한다.
man3C 라이브러리 함수. 소프트웨어 패키지에는 대부분 개발자가 기존 기능을 확장하여 새로운 소프트웨어를 작성하거나 완전히 새로운 소프트웨어를 개발할 수 있는 확장 코드 라이브러리가 있다. 각 라이브러리는 보통 man 페이지 형태로 문서화되어 있으며 libc와 같은 일부 라이브러리는 개별 함수나 관련된 함수의 작은 서브세트가 별도로 문서화될 정도로 매우 광범위하다.
man4장치 및 드라이버와 같은 특정 파일.
man5파일 형식. UNIX에서는 거의 텍스트 구성 파일만을 사용하여 시스템 조작을 사용자 정의한다. 네트워크 서비스 목록(/etc/services)에서부터 사용 가능한 쉘 목록(/etc/shells)까지 다양한 구성 파일이 있다.
man6게임 및 화면보호기.
man7기타 파일. 이는 다양한 파일이 포함된 통합 범주이다. 기존 시스템에서는 glob 연산자, 정규식 등을 학습할 수 있다.
man8수퍼 사용자가 사용할 가능성이 있는 시스템 관리 명령 등이 해당한다.

어떤 경우에는 다른 섹션에 같은 이름의 구성요소가 있을 수 있다. 이러한 경우는 특히 소프트웨어 패키지가 함께 동작하는 몇 개의 부분으로 구성된 경우에 일반적으로 발생한다. 예를 들어 작업을 스케쥴링하는 crontab 명령은 섹션 1에 있다. 반면에 실행할 작업을 기술하는 crontab 파일 형식은 섹션 5에 있을 수 있다.

섹션 간 구성요소의 차이를 구별하기 위해 섹션 번호를 첫 번째 인수로 제공한다.

$ man 1 crontab$ man 5 crontab

첫 번째 명령은 해당 명령에 대한 세부사항을 표시하며 두 번째 명령은 해당 명령의 파일 형식을 보여준다. 소프트웨어가 다수의 섹션에 존재하는데 섹션 번호를 지정하지 않는 경우 man은 가장 낮은 번호가 지정된 섹션에서 일치하는 결과를 표시한다.


man 페이지의 내용

명령마다 옵션이 매우 다양하지만 man 페이지의 내용은 매우 규칙적이다. 실제로 man 페이지는 이러한 규칙으로 인해 그 가치가 높게 평가된다. 조금만 읽어도 원하는 정보가 있는 문서의 해당 부분으로 바로 이동할 수 있다.

man 페이지는 최소한 이름, 시놉시스, 설명, 일부 예 그리고 다른 영구 자료에 대한 참조와 같은 5개의 세그먼트로 구성된다. 그림 1에는 첫 번째 세 세그먼트가 표시되어 있다.

  • name 필드에는 명령이나 함수 또는 파일 형식의 이름과 해당 소프트웨어의 기능에 대한 정확한 설명이 한 행으로 기술되어 있다.
  • synopsis 필드에는 소프트웨어 사용 방법이 간략하게 설명되어 있다. man 페이지의 대상이 명령인 경우 이 필드에는 필수 및 선택적 전환, 인수의 형식 그리고 인수 순서가 표시된다. 그 대상이 시스템 호출이나 라이브러리 함수인 경우 이 필드에 해당 함수를 사용하는 데 필요한 헤더 파일이 있으면 그 헤더 파일 및 함수의 형식적 인수가 표시된다.

    예를 들면 다음은 BSD UNIX의 du 명령에 대한 시놉시스이다.

    du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k | -m | -g] [-x]   [-I mask] [file ...]

    명령 시놉시스에서 사용한 표기법은 man 시스템에 있는 유용한 규칙 중 하나이며 -model 유틸리티에서 제공한 사용법 힌트에도 확장된다. 이 표기법은 "du 다음에 -H, -L 또는 -P 중 하나를 선택적으로 지정하고 다시 -a, -s 또는 -d 중 하나를 depth와 함께 선택적으로 입력하고 -c를 지정하거나 생략할 수 있으며 다음에 -h, -k, -m 또는 -g 중 하나를 선택적으로 입력하고 -x를 지정하거나 생략할 수 있으며 계속해서 -I를 mask와 함께 지정하거나 생략할 수 있으며 마지막으로 조작할 하나 이상의 파일 이름을 입력한다."라고 해석할 수 있다. 생략 표시가 있는 (...) 부분은 둘 이상을 의미한다.

    옵션은 첫 번째 일괄처리인 -H, -L-P와 같이 서로 그룹화되어 있으며 마치 GUI(Graphical User Interface)의 라디오 단추와 같아서 몇 개의 형식 중 하나만을 선택할 수 있다. -c-x와 같은 독립 옵션은 선택란과 같아서 선택하거나 해제할 수 있다. 이 표현식을 읽어서 동작으로 변환하는 과정은 매우 빠르며 또 다른 특성에 해당한다.

    다음은 BSD UNIX open() 시스템 호출의 시놉시스이다.

    #include <fcntl.h>int open(const char *path, int oflag, ...);

    이 시놉시스는 fcntl.h 헤더 파일이 필요하며 open()은 정수를 리턴하고 열 파일에 대한 경로 그리고 모드(읽기 전용, 읽기/쓰기, 열기 및 자르기 등)를 결정할 플래그 배치를 지정해야 한다는 것을 표시한다.

  • description 세그먼트에는 명령에서 사용할 수 있는 모든 옵션과 기능, 사용법이 자세히 설명되어 있다. du -H에 대한 기능을 알고자 하는 경우 description 필드의 텍스트를 읽으면 된다.
  • examples 섹션에는 해당 유틸리티에 대한 일반적인 사용법이 표시되며 특별한 사례가 설명과 함께 표시되는 경우도 있다.
  • See Also라는 제목의 마지막 섹션에는 기타 관련 명령, 중요한 시스템 파일, 산업 규격 스펙 등과 같은 추가 자료가 표시되어 있다.

앞서 언급한 섹션 외에도 man 페이지에는 기타 다수의 특별 섹션이 포함되어 있다. 한 가지 중요한 변수는 "Environment"이다. 여기에는 유틸리티의 조작에 영향을 줄 수 있도록 설정할 수 있는 환경 변수가 표시되어 있다. 예를 들어 man에 대한 man 페이지에는 man을 사용자 정의하기 위해 변경할 수 있는 환경 변수가 약 10개가 표시되어 있다. 그 중 하나는 MANPATH인데 이 변수는 man 페이지의 검색 디렉토리를 표시한다.


유용한 man 사용법

그렇다면 man을 효과적으로 사용하는 방법은 무엇일까? 여기에 몇 가지 유용한 팁이 있다.

  • MANPATH를 이용하여 사용자 정의한다. 다시 생각해보면 쉘 변수 PATH가 실행 파일을 검색할 디렉토리를 표시한다는 것을 알 수 있을 것이다. 예를 들어 PATH를 /usr/bin:/bin:/usr/local/bin으로 설정하면 쉘은 이 세 개의 디렉토리를 순서대로 검색하여 명령행 프로그램을 찾는다. 마찬가지로 man 페이지를 찾을 디렉토리 목록을 콜론으로 분리하여 MANPATH에 설정할 수 있다. 즉, MANPATH를 /usr/share/man:/usr/local/mysql/man(각각은 저장소의 루트 디렉토리)으로 설정하면 man은 일치하는 man 페이지를 찾기 위해 두 디렉토리를 모두 검색한다.
  • man 페이지 저장소의 내용을 검색한다. man 유틸리티는 man 페이지의 문자열을 검색할 수 있다. 문자열을 검색하려면 man -k 패턴을 입력하여 패턴을 포함하는 모든 페이지를 찾는다. 한 가지 단점은 이 조작은 매우 느릴 수 있다는 점이다. 한 가지 대안은 apropos를 사용하는 것이다. apropos는 man에 부속되어 있지만 각 페이지의 name 필드만을 검색한다. apropos는 man -k만큼 검색 범위가 넓지는 않지만 속도가 매우 빠르다.
  • 선호하는 페이저를 사용한다. man 유틸리티는 출력을 사용자 정의할 수 있는 다수의 환경 변수를 인식한다. less와 같은 선호하는 페이징 애플리케이션을 사용하려면 PAGER 환경 변수를 설정한다. 일부 시스템은 man 페이지를 HTML(Hypertext Markup Language) 형태로 제공하며 이러한 시스템에서는 BROWSER 환경 변수를 사용하여 선호하는 브라우저를 설정한다.
  • 원하는 내용을 찾는다. PAGER의 검색 기능을 사용하여 원하는 내용을 신속하게 찾는다. 예를 들어 man 명령의 man 페이지를 검색 중이고 페이저가 less이며 MANPATH에 관한 정보를 알고 싶은 경우 /MANPATH(슬래시는 검색 명령 임)를 입력한 후 Return을 누른다. less 페이저는 일치하는 모든 문자열을 강조하며 사용자는 n?를 사용하여 각각 일치하는 다음 문자열이나 이전 문자열을 찾을 수 있다.
  • 필요 없는 내용은 제거한다. MANSECT 환경 변수를 사용하여 검색을 하고자 하는 man 페이지의 섹션을 표시한다(즉, 1, 3, 4에서 8까지). MANSECT에 표시하지 않은 섹션은 검색에서 제외된다. 예를 들어 섹션 1을 검색에서 제외하고 섹션 5를 집중적으로 보고자 하는 경우 MANSECT을 5로 설정한다.
  • man 페이지 파일을 읽는다. 새로운 man 페이지를 작성 중이거나 인터넷에서 일부 파일을 다운로드한 경우 man의 직접 모드를 사용하여 하나의 man 페이지를 읽을 수 있다. 특정 파일을 읽으려면 man 파일 이름을 실행한다. 여기서 파일 이름은 해당 파일에 대한 완전한 경로이다. 예를 들어, 섹션 1에 주식 시세를 표시하는 새로운 명령을 작성 중인 경우 사용자는 man ./stocks.1을 사용하여 man 페이지를 미리볼 수 있다. (앞에 있는 경로를 생략하면 manstocks.1이라고 하는 man 페이지를 MANPATH에서 찾는다.)
  • man을 사용하여 동료를 돕는다. 시스템에 man 페이지를 일괄처리로 설치하는 경우 MANPARH 전역 변수를 새로운 디렉토리를 포함하도록 변경하여 시스템을 공유하는 모든 사용자가 해당 man 페이지를 볼 수 있도록 할 수 있다. /etc/manpaths 텍스트 파일에는 라인당 하나의 저장소가 표시되어 있다. 또한 /etc/manpaths.d 디렉토리에 새로운 목록을 작성하여 전체 서브시스템을 설정할 수 있다. 자세한 정보를 확인하려면 man man.conf를 입력한다.

그렇지만, 해당 시스템에 정의된 시스템 전체의 man 페이지를 표시할 경우에는 간단히 manpath를 입력하면 된다.

$ manpath/usr/local/man:/usr/local/share/man:/usr/share/man:/usr/man

그러나 man의 일부 버전은 더 나아가 manpath에 표시된 디렉토리 이외의 디렉토리를 검색한다. 다시 말해서 BSD UNIX에서는 man이 PATH에 표시된 각 디렉토리는 물론이고 PATH에 나열된 각 경로의 상위 디렉토리도 검색한다. 따라서 PATH에 /usr/mysql/bin이 있는 경우 man은 특정 경로를 검색하여 /usr/mysql/man을 찾는다.


man이 있다는 것을 기억하라!

UNIX 시스템은 벤더마다 다르며 따라서 해당 man 페이지 시스템은 여기에서 설명한 기능과는 다르게 더 좋거나 나쁠 수 있다. 그러나 이제까지 상세한 내용을 알아보았으므로 그러한 차이를 스스로 해결할 수 있을 것이다.

"유용한 man 페이지를 읽으라"는 구호를 꼭 기억하라.


참고자료

교육

  • man의 역사에서 UNIX man 페이지 시스템의 역사를 알 수 있다.

  • FreeBSD man pages에서 여러 가지 UNIX 및 Linux 버전의 광범위한 man 페이지 저장소에 대한 주제를 검색할 수 있다.

  • Speaking UNIX에서 이 시리즈의 다른 부분을 확인할 수 있다.

  • UNIX 쉘을 학습할 수 있다.

  • developerWorks의 AIX와 UNIX 영역에서는 AIX 시스템 관리의 모든 기능에 관한 다양한 정보와 UNIX 능력을 개선할 수 있는 정보를 볼 수 있다.

  • New to AIX and UNIX: 여기에서 AIX와 UNIX에 대한 자세한 정보를 확인할 수 있다.

  • 기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.

토론

필자소개

Photo of Martin Streicher

Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 예술 작품과 장난감 수집을 좋아한다.

+ Recent posts