통칭 man page는 유닉스를 사용하고자 하는 뉴비들의 거대한 진입장벽과 같은 존재다. 유닉스에 대해 질문하면 거의 대다수는 매뉴얼을 먼저 읽어보라고 한다. 하지만 읽는 방법을 모르기 때문에 읽어도 답이 나오질 않는다. (영어 실력과는 아무 관계가 없음) 이 매뉴얼 페이지는 대체 어떻게 사용하는 것일까? 간단하게 핵심만 추리기는 어렵다. 상세한 설명으로 man page가 왜 이렇게 짜여져있는지 알아보자.
1. man page의 목적과 장단점
man은 간단히 설명하자면 위에 나와있는 것과 같이 시스템에 대한 일종의 설명서이다. 그저 RTFM하면 된다. 문제는 이 설명서가 일반인을 대상으로 하는게 아니라 유닉스 사용에 익숙한 전문가를 대상으로 작성되었기 때문이다. 그리고 그 전문가가 man page를 작성한 것이다. 그런데 그렇게 잘난 유닉스 시스템 전문가가 왜 설명서를 읽어야 할까? 이 전문가라는 의미도 유닉스 시스템을 마스터한 사람이 아니라 전반적으로 시스템이 어떻게 돌아가는지 아는 프로그래머(또는 익숙한 사용자) 같은 사람들을 말한다. 당연히 유닉스에 대한 모든 것을 알아서 전문가가 아니고 유닉스 파생 운영체제들의 세부 동작이 항상 같다고 할 수 없기 때문이다. 자기가 쓰는 운영체제의 기능을 전부 알지 못하는데 다른 시스템은 오죽할까. 결론은 man의 목적이 설명서는 맞지만 유닉스 시스템에 어느정도 익숙한 자를 대상으로 쓰여졌기 때문이라는 것이다. 그래서 이 man page는 유닉스 시스템에 아직 익숙하지 못한 초보 프로그래머들에게는 커다란 장벽이 될 수 밖에 없다. (실제로 매뉴얼 잡고 몇달동안 늘어지는 것보다 제대로된 책 하나 읽고 오는게 시간이 덜 걸릴수도 있다.)
다음은 man의 장점을 알아보자 :
(1). 유닉스의 거의 모든 기능을 담고 있다.
사실 가장 중요한 장점이다. 윈도우에도 man과 비슷한 기능으로 help가 있지만 빈약한 CLI 명령어에 대한 짤막한 설명만 담고 있고 시스템 프로그래밍에 대한 정보는 주지 않는다. 반면 man page는 시스템 호출은 기본이고 함수 원형, 인자들에 대한 설명도 전부 담고 있다. 규모부터가 넘사벽이다.
(2). 오프라인 열람이 가능하다.
컴퓨터가 네트워크에 접속되어 있지 않아도 접근이 가능하다. 왜냐하면 man page도 결국 운영체제 패키지중의 일부이기 때문이다.
반대로 단점은 다음과 같다 :
(1). 익숙하지 않으면 읽기 어렵다.
(2). 패키지의 일종이기 때문에 설치되어 있지 않는 경우가 간혹 존재한다.
임베디드 시스템의 경우, 기본적으로 없다.
(3). 다국어 지원이 부실하다.
(4). 서드파티 패키지들은 제공하지 않거나 온라인으로만 제공하는 경우(또는 온라인에 더 자세한 설명이 있는 경우)가 있다.
2. man page는 이름이 있는 모든 것에 대해 설명을 담고 있다.
시스템 호출이나 라이브러리는 함수 이름이나 대상체, 타입 정의들을, 그리고 디스크에 존재하는 고유의 설정 파일도 엄연히 이름을 가지고 있기 때문에 검색이 가능하다.
문제는 중복되는 이름이 많기 때문에(예를 들어 write는 일반적으로 시스템 호출이지만 명령어로도 존재하고 둘의 목적이 다르다) 이름만으로는 제대로 검색이 되지 않을수도 있다. 그래서 목적이나 그룹으로 나눠서 섹션 번호를 붙히고 이 번호로 같은 이름을 구분한다. 예를 들어 명령어와 시스템 호출 unlink는 각각 unlink(1)과 unlink(2)로 구분한다. 이 숫자는 섹션 번호이기 때문에 어떤 함수의 인자 개수라던가 특정 형식을 말하는 것이 아니다.
이제 반대로 섹션 번호로 검색을 해보자. kill은 마찬가지로 명령어로도 존재하지만 시스템 호출로도 존재한다. 이때 시스템 호출을 찾으려면 $ man kill;로 하면 보통은 명령어로 찾아진다. 원하는 정보인 시스템 호출에 대한 내용을 볼려면 단순히 섹션 번호를 앞에 붙혀주기만 하면 된다. $ man 2 kill;과 같이 하면 된다.
3. 너무 설명이 자세하고 암묵적으로(또는 암시적으로) 설명해주는 내용이 많아서 이해하기 어렵다.
open(2) 호출이 가장 난관인데 이 녀석은 념글에 올라와있는 것처럼 두번째 인자로 O_CREAT가 전달되면 세번째 인자가 필요하다. 라고 설명해준다면 좋겠지만 실제로는 그렇게 나와있지 않다.
The mode argument specifies the file mode bits to be applied when a new file is created. If neither O_CREAT nor O_TMPFILE is specified in flags, then mode is ignored (and can thus be specified as 0, or simply omitted). The mode argument must be supplied if O_CREAT or O_TMPFILE is specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.
문제가 되는 부분은 다음 문장인데
if O_CREAT or O_TMPFILE is specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.
만약 O_CREAT이나 O_TMPFILE이 제공되지 않으면 스택에 있는 쓰레기 값이 파일 모드로 적용된다는 말인데 그냥 간단하게 그런 값이 제공되면 세번째 인자가 필요하다는 말을 어렵게 풀어놓았다. 이런류의 설명이 man page에 가득하고 결국 유닉스 시스템을 잘 알아야 함정을 피해갈 수 있다는 것.
4. 영어 실력은 크게 중요하지 않다. 아는 것 만큼 보이는게 가장 큰 문제.
3번에 나온 설명도 시스템 호출에 대해 잘 모르는 대신에 영어를 잘해서 의미 그대로 해석하면 그냥 세번째 인자는 선택적으로 필요하다고 생각할지도 모른다. 축하한다. 함정에 걸려버렸다. 유닉스 시스템 프로그래머는 당연히 세번째 인자가 필요할 수 있다는 것을 안다. 그래서 저런 허접한 함정에는 걸리지 않는다. 영어 실력만 과신하지 말고 숨겨진 의미를 찾거나 의미를 알고 있는 상태에서 참고용으로만 사용해야 한다.
위에서 이미 다 설명한 부분이지만 유닉스 시스템에 어느정도는 익숙해야 제대로 써먹을 수가 있다. 그렇지 않으면 man page는 그저 선조가 남긴 고대 유물을 해석하는 일이 되버린다.
5. 실전 사용: vi식 키맵과 정규표현식
이제 원하는 페이지를 본격적으로 읽어보고자 한다. 그 전에 vi식 키맵(약간의 변형)을 알아야 한다.
vi는 알다시피 h, j, k, l로 이동한다는 것을 알고 있을거라 생각하고 세부적인 설명은 하지 않겠다. man page는 편집기가 아니라 터미널 페이저로 구현되기 때문에(보통은 less) 거의 대부분의 편집키는 먹히지 않는다. (또는 다른 용도로 사용됨) 일단 j, k로 스크롤하는 것은 같지만 h는 설명서(man page가 아닌 less에 대한 설명서)로, q는 종료에 할당되어 있다. h에 대부분 기능 설명이 나와있기 때문에 세부 설명은 하지 않는다.
정규표현식을 여기서 설명하기에는 너무 길어지기 때문에 따로 설명하지는 않지만 검색 기능을 제대로 써먹으려면 정규표현식은 필수다. 예를 들어 open에 대한 페이지에서 const char *에 대해 찾아볼려면 /const\schar\s\*로 찾아야 한다. 이건 vi와는 별개로 프로그래머라면 기본 소양이기 때문에 마찬가지로 세부 설명은 하지 않음. 만약 정규표현식으로 간단한 검색조차 하지 못한다면 man page를 제대로 사용하기 어렵다.
6. 그래서 뭘 해야할까?
사람들은 왜 RTFM하라는 걸까? 여기까지 읽었는데도 여전히 답을 찾지 못하면 man page를 봐서는 안된다.
유닉스 시스템에 익숙하고, 영어를 읽을 정도만 되고, 시스템 관리자 또는 프로그래머에게 도움이 되라고 만든게 man page이다. 늅늅이에게 도움되라고 만든 물건은 아니라는 거다. 계속 유닉스 시스템에 익숙해야 한다는 점을 강조하는 것은 틀린 말이 아니다.
아마 man을 읽어야 한다고 조언하는 사람들은 늅늅이가 이걸 제대로 이해할 수 있을지 알거라 생각하는 사람들이라 생각함. (나도 그렇게 생각함) 그런데 좀만 관점을 바꿔보자. 우리가 한번도 man page에 대해 읽는 방법을 상세히 설명하지 않았다. 그런 상황에서는 늅늅이에게 아무 도움도 되지 않는다. 그래서 내 결론은 man page는 중요하지만 읽는 방법은 쉽게 알 수 있어야 하지 않을까?
1. man page의 목적과 장단점
man은 간단히 설명하자면 위에 나와있는 것과 같이 시스템에 대한 일종의 설명서이다. 그저 RTFM하면 된다. 문제는 이 설명서가 일반인을 대상으로 하는게 아니라 유닉스 사용에 익숙한 전문가를 대상으로 작성되었기 때문이다. 그리고 그 전문가가 man page를 작성한 것이다. 그런데 그렇게 잘난 유닉스 시스템 전문가가 왜 설명서를 읽어야 할까? 이 전문가라는 의미도 유닉스 시스템을 마스터한 사람이 아니라 전반적으로 시스템이 어떻게 돌아가는지 아는 프로그래머(또는 익숙한 사용자) 같은 사람들을 말한다. 당연히 유닉스에 대한 모든 것을 알아서 전문가가 아니고 유닉스 파생 운영체제들의 세부 동작이 항상 같다고 할 수 없기 때문이다. 자기가 쓰는 운영체제의 기능을 전부 알지 못하는데 다른 시스템은 오죽할까. 결론은 man의 목적이 설명서는 맞지만 유닉스 시스템에 어느정도 익숙한 자를 대상으로 쓰여졌기 때문이라는 것이다. 그래서 이 man page는 유닉스 시스템에 아직 익숙하지 못한 초보 프로그래머들에게는 커다란 장벽이 될 수 밖에 없다. (실제로 매뉴얼 잡고 몇달동안 늘어지는 것보다 제대로된 책 하나 읽고 오는게 시간이 덜 걸릴수도 있다.)
다음은 man의 장점을 알아보자 :
(1). 유닉스의 거의 모든 기능을 담고 있다.
사실 가장 중요한 장점이다. 윈도우에도 man과 비슷한 기능으로 help가 있지만 빈약한 CLI 명령어에 대한 짤막한 설명만 담고 있고 시스템 프로그래밍에 대한 정보는 주지 않는다. 반면 man page는 시스템 호출은 기본이고 함수 원형, 인자들에 대한 설명도 전부 담고 있다. 규모부터가 넘사벽이다.
(2). 오프라인 열람이 가능하다.
컴퓨터가 네트워크에 접속되어 있지 않아도 접근이 가능하다. 왜냐하면 man page도 결국 운영체제 패키지중의 일부이기 때문이다.
반대로 단점은 다음과 같다 :
(1). 익숙하지 않으면 읽기 어렵다.
(2). 패키지의 일종이기 때문에 설치되어 있지 않는 경우가 간혹 존재한다.
임베디드 시스템의 경우, 기본적으로 없다.
(3). 다국어 지원이 부실하다.
(4). 서드파티 패키지들은 제공하지 않거나 온라인으로만 제공하는 경우(또는 온라인에 더 자세한 설명이 있는 경우)가 있다.
2. man page는 이름이 있는 모든 것에 대해 설명을 담고 있다.
시스템 호출이나 라이브러리는 함수 이름이나 대상체, 타입 정의들을, 그리고 디스크에 존재하는 고유의 설정 파일도 엄연히 이름을 가지고 있기 때문에 검색이 가능하다.
문제는 중복되는 이름이 많기 때문에(예를 들어 write는 일반적으로 시스템 호출이지만 명령어로도 존재하고 둘의 목적이 다르다) 이름만으로는 제대로 검색이 되지 않을수도 있다. 그래서 목적이나 그룹으로 나눠서 섹션 번호를 붙히고 이 번호로 같은 이름을 구분한다. 예를 들어 명령어와 시스템 호출 unlink는 각각 unlink(1)과 unlink(2)로 구분한다. 이 숫자는 섹션 번호이기 때문에 어떤 함수의 인자 개수라던가 특정 형식을 말하는 것이 아니다.
이제 반대로 섹션 번호로 검색을 해보자. kill은 마찬가지로 명령어로도 존재하지만 시스템 호출로도 존재한다. 이때 시스템 호출을 찾으려면 $ man kill;로 하면 보통은 명령어로 찾아진다. 원하는 정보인 시스템 호출에 대한 내용을 볼려면 단순히 섹션 번호를 앞에 붙혀주기만 하면 된다. $ man 2 kill;과 같이 하면 된다.
3. 너무 설명이 자세하고 암묵적으로(또는 암시적으로) 설명해주는 내용이 많아서 이해하기 어렵다.
open(2) 호출이 가장 난관인데 이 녀석은 념글에 올라와있는 것처럼 두번째 인자로 O_CREAT가 전달되면 세번째 인자가 필요하다. 라고 설명해준다면 좋겠지만 실제로는 그렇게 나와있지 않다.
The mode argument specifies the file mode bits to be applied when a new file is created. If neither O_CREAT nor O_TMPFILE is specified in flags, then mode is ignored (and can thus be specified as 0, or simply omitted). The mode argument must be supplied if O_CREAT or O_TMPFILE is specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.
문제가 되는 부분은 다음 문장인데
if O_CREAT or O_TMPFILE is specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.
만약 O_CREAT이나 O_TMPFILE이 제공되지 않으면 스택에 있는 쓰레기 값이 파일 모드로 적용된다는 말인데 그냥 간단하게 그런 값이 제공되면 세번째 인자가 필요하다는 말을 어렵게 풀어놓았다. 이런류의 설명이 man page에 가득하고 결국 유닉스 시스템을 잘 알아야 함정을 피해갈 수 있다는 것.
4. 영어 실력은 크게 중요하지 않다. 아는 것 만큼 보이는게 가장 큰 문제.
3번에 나온 설명도 시스템 호출에 대해 잘 모르는 대신에 영어를 잘해서 의미 그대로 해석하면 그냥 세번째 인자는 선택적으로 필요하다고 생각할지도 모른다. 축하한다. 함정에 걸려버렸다. 유닉스 시스템 프로그래머는 당연히 세번째 인자가 필요할 수 있다는 것을 안다. 그래서 저런 허접한 함정에는 걸리지 않는다. 영어 실력만 과신하지 말고 숨겨진 의미를 찾거나 의미를 알고 있는 상태에서 참고용으로만 사용해야 한다.
위에서 이미 다 설명한 부분이지만 유닉스 시스템에 어느정도는 익숙해야 제대로 써먹을 수가 있다. 그렇지 않으면 man page는 그저 선조가 남긴 고대 유물을 해석하는 일이 되버린다.
5. 실전 사용: vi식 키맵과 정규표현식
이제 원하는 페이지를 본격적으로 읽어보고자 한다. 그 전에 vi식 키맵(약간의 변형)을 알아야 한다.
vi는 알다시피 h, j, k, l로 이동한다는 것을 알고 있을거라 생각하고 세부적인 설명은 하지 않겠다. man page는 편집기가 아니라 터미널 페이저로 구현되기 때문에(보통은 less) 거의 대부분의 편집키는 먹히지 않는다. (또는 다른 용도로 사용됨) 일단 j, k로 스크롤하는 것은 같지만 h는 설명서(man page가 아닌 less에 대한 설명서)로, q는 종료에 할당되어 있다. h에 대부분 기능 설명이 나와있기 때문에 세부 설명은 하지 않는다.
정규표현식을 여기서 설명하기에는 너무 길어지기 때문에 따로 설명하지는 않지만 검색 기능을 제대로 써먹으려면 정규표현식은 필수다. 예를 들어 open에 대한 페이지에서 const char *에 대해 찾아볼려면 /const\schar\s\*로 찾아야 한다. 이건 vi와는 별개로 프로그래머라면 기본 소양이기 때문에 마찬가지로 세부 설명은 하지 않음. 만약 정규표현식으로 간단한 검색조차 하지 못한다면 man page를 제대로 사용하기 어렵다.
6. 그래서 뭘 해야할까?
사람들은 왜 RTFM하라는 걸까? 여기까지 읽었는데도 여전히 답을 찾지 못하면 man page를 봐서는 안된다.
유닉스 시스템에 익숙하고, 영어를 읽을 정도만 되고, 시스템 관리자 또는 프로그래머에게 도움이 되라고 만든게 man page이다. 늅늅이에게 도움되라고 만든 물건은 아니라는 거다. 계속 유닉스 시스템에 익숙해야 한다는 점을 강조하는 것은 틀린 말이 아니다.
아마 man을 읽어야 한다고 조언하는 사람들은 늅늅이가 이걸 제대로 이해할 수 있을지 알거라 생각하는 사람들이라 생각함. (나도 그렇게 생각함) 그런데 좀만 관점을 바꿔보자. 우리가 한번도 man page에 대해 읽는 방법을 상세히 설명하지 않았다. 그런 상황에서는 늅늅이에게 아무 도움도 되지 않는다. 그래서 내 결론은 man page는 중요하지만 읽는 방법은 쉽게 알 수 있어야 하지 않을까?
개추
어떻게 RTFM의 F가 Fucking이 아니고 Friendlyㅋㅋㅋㅋㅋ
rtfm이 뭐임 read the fucking manual?
중간에 open 설명에 앞뒤에 내용이 장황해서 그렇지 The mode argument must be supplied if O_CREAT or O_TMPFILE is specified in flags; 라고 직접 언급하긴 했네
다시보니까 그렇네, 근데 장황하기도 하고 설명이 어렵다
어쩐지 읽기 힘들더라.. 더 열심히 공부해야겠다
설명서를 읽는 법을 설명하는 문서를 읽는 법을 설명하는 글
https://xkcd.com/1343/
기능을 배우려고 읽는다기 보다는 배운 사람이 까먹었을 때 읽는게 더 맞을 듯
함수 원형을 넘어서 최소한 그 함수가 무슨 역할을 하는지 어떻게 쓰는지는 알아야 하니 배운 사람이 까먹을때 읽는게 맞긴 함.