해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다
여기까지 오면서 여러가지 알 수 없는 옵션과 아규먼트를 가진 알 수 없는 명령어들을 보았습니다. 이번 챕터에서는 알 수 없었던 부분을 해소하고 우리만의 명령어도 만들어보겠습니다. 이번 장에서는 다음과 같은 명령어들을 살펴보겠습니다.
- `type` - 명령어가 입력될 때 어떻게 해석되는지를 표시합니다
- `which` - 명령어가 입력될 때 실제 실행되는 파일을 표시합니다
- `help` - 내장 명령어의 사용 용법, 옵션, 예제를 표시합니다
- `man` - 매뉴얼 페이지를 표시합니다
- `apropos` - 명령어와 관련된 모든 매뉴얼 페이지 항목을 표시합니다
- `info` - 명령어의 info 페이지를 검색합니다
- `whatis` - 명령어에 대한 간단한 설명을 표시합니다
- `alias` - 명령어의 별칭을 생성합니다.
명령어가 정확히 무엇일까요?
명령어는 아래 네 가지 중 하나입니다:
- 실행 가능한 프로그램: /usr/bin에서 본 파일들과 같은 실행 가능한 프로그램들 입니다. 이 카테고리에 있는 프로그램은 C나 C++로 작성된 컴파일된 바이너리(compiled binaries)거나 쉘, 펄, 파이썬, 루비등과 같은 스크립트 언어(scripting langueages)로 작성된 프로그램입니다.
- 쉘 자체에 내장된 명령어: bash는 내부적으로 쉘 빌트인(shell builtins)이라고 불리는 여러 명령어를 지원합니다. 예를 들어, `cd`는 쉘 빌트인입니다.
- 쉘 함수: 쉘 함수는 환경(environment)에 통합된 미니어처 쉘 스크립트입니다. 환경 설정이나 쉘 함수를 작성하는 방법에 대해서는 이후의 챕터들에서 다룰 것입니다. 지금은 그런 것이 있다는 것만 알아두세요
- 별칭(alias): 별칭은 사용자가 직접 정의할 수 있는 명령어로, 기존의 다른 명령어들로 구성된 새로운 명령어를 만들 수 있습니다.
명령어 식별
사용하는 명령어가 위 카테고리중 어느 것에 속하는지 아는 것이 유용할 때가 종종 있습니다. 리눅스는 이를 위한 몇 가지 방법을 제공합니다.
`type` - 명령어의 타입을 표시
`type`은 명령어가 주어졌을 때 쉘이 실행할 명령어의 종류를 출력하는 쉘 빌트인입니다. 다음과 같이 작동합니다:
"command"는 우리가 알아보고자 하는 명령어입니다. 몇 가지 예시를 보겠습니다:
여기서는 세 가지의 명령어에 대한 결과를 볼 수 있습니다. `ls`에 대한 결과에서 `ls`라는 명령어가 `ls`에 "`--color==tty`"라는 옵션이 붙은 명령어의 별칭이라는 것을 알 수 있습니다. 이제 `ls`가 왜 색깔이 있는 결과를 출력하는 지 알게되었네요!
`which` - 실행 파일의 위치 표시
어떤 경우에는 시스템에 프로그램이 여러 버전이 존재할 수 있습니다. 데스크탑 시스템에서는 일반적이지 않지만, 대규모 서버에서는 드문 경우가 아닙니다. 정확히 실행 파일의 위치를 알고자 할 때 `which` 명령어를 사용합니다.
`which`는 실행 가능한 프로그램과만 작동하고 실제 프로그램을 대체하는 빌트인이나 별칭에는 작동하지 않습니다. `which`를 `cd`와 같은 쉘 빌트인에 대해 사용하면 아무런 메시지를 출력받지 못하거나 에러 메시지를 확인할 수 있습니다:
출력된 결과는 "command not found"를 꾸며놓은 것에 불과합니다.
명령어의 문서를 가져오기
명령어가 무엇인지에 대해 배웠으므로 이제 각 종류의 명령에 대한 문서를 검색해보겠습니다.
`help` - 쉘 빌트인에 대한 도움말
bash는 각 쉘 빌트인에 도움 기능을 내장하고 있습니다. 이를 사용하기 위해서 쉘 빌트인 앞에 `help`를 입력하면 됩니다. 예시를 보세요:
표기에 대한 설명: 명령어 문법에 관한 설명에 등장하는 대괄호는 선택적인 옵션을 의미합니다. 수직 바(bar)는 동시에 사용될 수 없는 옵션들을 나타냅니다. `cd` 명령어에 대한 예시에서:
이 표기는 `cd` 명령어 뒤에 "-L"이나 "-P"가 붙을 수 있고, "-P" 옵션이 사용되었다면 "-e" 옵션도 뒤에 "dir" 아규먼트와 함께 사용될 수 있다는 것을 의미합니다.
`help`의 `cd`에 대한 출력 결과가 압축적이고 정확하지만 자세히 설명하고 있지는 않고있습니다. 그리고 우리가 배우지 않은 내용에 대해서도 많이 쓰여있습니다. 걱정하지 마세요. 모두 배우게될 것입니다.
`--help` - 용법에 관한 정보 표시
많은 실행 프로그램들은 명령어의 문법과 옵션에 관한 설명을 표시하는 "`--help`" 옵션을 지원합니다.
어떤 프로그램들은 "`--help`" 옵션을 지원하지 않습니다. 그래도 일단 시도는 해보세요.
`man` - 프로그램의 매뉴열 페이지를 표시합니다
커맨드 라인에서 사용되도록 의도된 대부분의 실행 프로그램은 매뉴얼(manual) 혹은 매뉴얼 페이지(man page)라고 부르는 공식적인 문서를 제공합니다. man이라는 특별한 페이징 프로그램(paging program)으로 그 문서를 볼 수 있습니다.
"program"이 어떤 명령어라고 할 때 위와 같이 입력하면 문서를 볼 수 있습니다.
매뉴얼 페이지들은 각각 포맷에 약간씩의 차이가 있는데 일반적으로 다음과 같은 내용을 포함합니다:
- 페이지 제목
- 명령어 문법에 대한 요약
- 명령어의 목적에 대한 설명
- 커맨드의 옵션 리스트와 설명
그러나 매뉴얼 페이지는 예시를 보여주지는 않습니다. 실습을 위해 `ls` 명령어의 매뉴얼 페이지를 보겠습니다:
대부분의 리눅스 시스템에서 `man`은 `less`를 사용하여 매뉴얼 페이지를 표시합니다. 따라서 익숙한 `less` 명령들을 모두 사용할 수 있습니다.
`man`이 표시하는 "매뉴얼"은 섹션별로 나누어져 있고 사용자 명령어 뿐만 아니라 시스템 관리 명령어, 프로그래밍 인터페이스, 파일 형식 등 다양한 주제를 다루고 있습니다. Table 5-1은 매뉴얼의 구성에 대해 설명합니다.
Table 5-1: Man Page Organization
섹션 | 내용 |
1 | 사용자 명령어 |
2 | 커널 시스템 호출을 위한 프로그래밍 인터페이스 |
3 | C 라이브러리 호출을 위한 프로그래밍 인터페이스 |
4 | 장치 노드나 드라이버와 같은 특수 파일 |
5 | 파일 형식 |
6 | 게임이나 오락거리 |
7 | 기타 |
8 | 시스템 관리 명령어 |
원하는 내용을 찾기 위해 매뉴얼의 특정 섹션을 참조해야 할 때가 있습니다. 명령어와 이름이 같은 파일 형식을 찾을 때 특히 그렇습니다. 섹션 번호를 명시하지 않으면 첫 번째로 일치하는 항목이 조회됩니다. 대부분의 경우, 이는 섹션 1(사용자 명령어)에서 찾은 결과가 될 것입니다. 섹션 번호를 명시하기 위해 다음과 같이 `man`을 사용합니다:
예시를 보겠습니다:
이는 /etc/passwd 파일의 파일 형식에 관해 설명하는 매뉴얼 페이지를 표시할 것입니다.
`apropos` - 적절한 명령어들을 표시
검색어와 매칭되는 매뉴얼 페이지들의 목록을 보는 방법도 있습니다. 정제된 결과는 아니지만 때때로 도움이 됩니다. 다음은 "partition"이라는 검색어를 사용했을 때 매뉴얼 페이지 검색 결과입니다:
각 줄의 첫 번째 필드는 매뉴얼 페이지의 제목이고, 두 번째 필드는 섹션 번호를 나타냅니다. "-k" 옵션을 사용한 `man` 명령어는 `apropos` 명령어와 동일하게 작동한다는 것을 알아두세요.
`whatis` - 한 줄 짜리 매뉴얼 페이지 설명을 표시
`whatis` 프로그램은 명시된 키워드와 매칭되는 매뉴얼 페이지의 제목과 한 줄 짜리 설명을 표시합니다.
가장 야만적인 매뉴얼 페이지
리눅스와 여타 유닉스 계열 시스템이 제공하는 매뉴얼 페이지들은 튜토리얼 보다는 참조 문서로 의도되었습니다. 많은 매뉴얼 페이지는 읽기 어렵지만 그 중에서도 가장 어려운 것은 bash에 대한 매뉴얼 페이지입니다. 이 책의 집필을 위해 자료들을 찾아보던 중 bash에 대한 주제를 많이 다루기 위해 bash의 맨 페이지를 자세하게 읽어보았습니다. 출력을 했을 때 80 페이지가 넘는 굉장히 빽빽하면서도 새로운 사용자는 알아듣지도 못하는 구조로 작성되어 있었습니다.
그러나 굉장히 정확하고 간결하며 매우 완벽했습니다. 그러니 한 번 읽어보시고 모두 이해가 되는 그 날을 기대해 보세요.
`info` - 명령어의 info entry 페이지 표시
GNU 프로젝트는 그들의 프로그램을 위해 매뉴얼 페이지를 대체할 "인포(info)"를 제공합니다. 인포 매뉴얼(info manuals)은 info라는 프로그램을 통해 출력됩니다. 인포 페이지는 웹 페이지처럼 하이퍼링크가 되어있습니다. 아래는 그 예시입니다:
info 프로그램은 인포 파일(info files)을 읽습니다. 인포 파일은 개별 주제를 가지는 각 노드들로 구성되는 트리입니다. 인포 파일은 노드를 옮겨다닐 수 있게 하이퍼 링크들을 가지고 있습니다. 하이퍼링크는 "*" 표시로 표현되고 커서를 위에 두고 엔터를 치면 동작합니다.
info를 띄우기 위해서 `info` 명령어 뒤에 프로그램의 이름을 입력합니다. Table 5-2는 인포 페이지를 읽는 중에 사용할 수 있는 명령들을 보여줍니다.
Table 5-2: `info` 명령
명령 | 동작 |
? | 명령 도움말을 표시합니다 |
PgUp 또는 Backspace | 이전 페이지로 돌아갑니다 |
PgDn 또는 Space | 다음 페이지로 넘어갑니다 |
n | 다음 노드로 넘어갑니다 |
p | 이전 노드로 돌아갑니다 |
u | 현재 노드의 부모 노드로 올라갑니다. 주로 메뉴입니다 |
Enter | 커서 위치의 하이퍼링크를 따라갑니다 |
q | 닫기 |
우리가 지금까지 봤던 대부분의 커맨드 라인 프로그램들은 GNU 프로젝트의 코어유틸(coreutils) 패키지에 속한 것들입니다. 따라서 다음과 같이 입력하면:
코어유틸 패키지에 있는 각 프로그램으로의 하이퍼링크가 있는 메뉴 페이지를 볼 수 있습니다.
README와 기타 프로그램 문서 파일
시스템에 설치된 많은 소프트웨어 패키지는 /usr/share/doc 디렉토리에 문서 파일을 가지고 있습니다. 이 중 대부분은 일반 텍스트 형식으로 저장되어 있으며 less 프로그램으로 내용을 볼 수 있습니다. 어떤 파일들은 HTML 형식을 가지고 있어 웹 브라우저로 내용을 볼 수 있습니다. 어떤 파일들은 ".gz" 확장자를 가지고 있습니다. 이는 gzip이라는 압축 프로그램으로 압축되어 있음을 의미합니다. gzip 패키지는 특수한 버전의 less인 zless를 가지고 있고 이를 사용해 gzip으로 압축된 텍스트 파일의 내용을 볼 수 있습니다.
`alias`를 이용해 우리만의 명령어 만들기
첫 번째 프로그래밍 경험을 위해 `alias` 명령어를 사용해 우리만의 명령어를 만들어보겠습니다. 그러나 시작하기 전에 작은 커맨드 라인 꼼수를 한 가지 알려드리겠습니다. 세미콜론을 사용해 각 명령어를 분리함으로써 여러개의 명령어를 한 줄에 작성할 수 있습니다. 이렇게요:
실제 사용 예시는 이렇습니다:
보시다시피 3개의 명령을 합쳐 한 줄에 작성했습니다. 맨 처음 디렉토리를 /usr로 바꾸고, 다음엔 디렉토리 내용을 출력하고, 마지막으로 이전 디렉토리로 돌아갑니다. 이제 `alias`를 이용해 이 명령어 묶음을 새로운 명령어로 만들어보겠습니다. 먼저 해야할 것은 새로운 명령어의 이름을 지어내는 것입니다. "test"로 해보죠. 그 전에, "test"가 이미 사용되고 있는 이름인지 알아내는게 좋을 것 같네요. 이를 알아내기 위해 다시 `type` 명령어를 사용해보겠습니다:
이런, `test`는 이미 사용되고 있었네요. 이번엔 `foo`를 사용해보죠:
좋네요! "foo"는 사용할 수 있겠어요. 이제 우리만의 alias를 만들어보겠습니다:
명령의 구조가 아래와 같이 되어있다는 것을 알아두세요:
`alias` 명령어 뒤에 alias 이름을 적고 공백 없이 바로 등호 "="와 함께 또 공백 없이 바로 이름에 할당 할 명령을 작은 따옴표 안에 입력합니다. 우리의 alias를 정의한 후에는 어디서나 사용할 수 있게 됩니다.
`type` 명령어를 사용하여 우리가 만든 alias를 살펴볼 수도 있습니다:
alias를 삭제하기 위해서는 `unalias` 명령어를 사용합니다:
시스템에 정의된 모든 alias를 보기 위해서는 다른 아규먼트 없이 `alias` 명령어를 사용하면 됩니다. 다음은 페도라 시스템에서 기본으로 정의된 일부 alias입니다. 각 alias가 무엇을 하는지 생각해보세요:
커맨드 라인에 alias를 정의하는 것에는 사소한 문제가 한 가지 있습니다. 쉘 세션이 종료되면 alias도 사라진다는 것입니다. 챕터 11에서 로그인 시마다 우리의 alias를 환경을 설정하는 파일에 추가하는 방법을 알아볼 것입니다. 지금은 작긴 하지만 쉘 프로그래밍의 세계에 한 발 내딛었다는 사실을 기뻐합시다!
요약
이제 명령어에 대한 설명서를 찾는 방법을 배웠으니 지금까지 접했던 모든 명령어에 대한 설명서를 찾아보세요. 어떤 추가 옵션이 있는지 살펴보고 사용해 보세요!
추가 자료
Linux와 커맨드 라인에 대한 많은 온라인 문서가 있습니다. 다음은 그 중 최고의 자료들입니다:
- "Bash Reference Manual"은 bash 쉘에 대한 공식 가이드입니다. bash 매뉴얼 페이지보다 읽기 쉽고 예제들을 가지고 있습니다.
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html
- "Bash FAQ"는 bash와 관련된 자주 나오는 질문들에 대한 답변을 적은 책입니다. 중급~상급 사용자들을 타겟으로 했지만 좋은 정보들이 많이 있습니다.
https://mywiki.wooledge.org/BashFAQ
- "GNU Project"는 리눅스 커맨드 라인 환경의 핵심을 이루는 프로그램에 대한 방대한 문서를 제공합니다.
https://www.gnu.org/manual/manual.html
- 위키피디아에도 매뉴얼 페이지에 관한 흥미로운 페이지가 있습니다:
https://en.wikipedia.org/wiki/Man_page
'리눅스 > Part 1 - Learning The Shell' 카테고리의 다른 글
리눅스 기초 | 7. 쉘처럼 세상 바라보기 (0) | 2024.05.24 |
---|---|
리눅스 기초 | 6. 리디렉션 (0) | 2024.05.23 |
리눅스 기초 | 4-2. 파일과 디렉토리 조작하기 (0) | 2024.05.21 |
리눅스 기초 | 4-1. 파일과 디렉토리 조작하기 (0) | 2024.05.20 |
리눅스 기초 | 3. 시스템 살펴보기 (0) | 2024.05.14 |