리눅스 셸이 인식할 수 있는 모든 명령어를 한 번에 나열해주는 명령어가 실제로 존재하지만, 이를 알고 있는 사용자는 생각보다 드뭅니다. GNU/Linux 기반 운영체제의 명령줄을 다루면서 마주치게 되는 가장 역설적인 상황(Catch-22)이 바로 이것입니다. 다행히도 셸이 직접 알려주지 않더라도 해당 명령어를 익히는 방법은 매우 간단합니다.
먼저 Ctrl+Alt+T를 눌러 터미널을 엽니다. Xfce4, KDE, LXDE 데스크톱 환경을 사용한다면 애플리케이션 메뉴에서 '시스템 도구(System Tools)'를 클릭한 후 '터미널(Terminal)'을 선택하세요. Ubuntu Unity 사용자는 Dash에서 '터미널'을 검색하면 됩니다. 물론 전통적인 가상 터미널 환경에서도 동일하게 작동합니다.
방법 1: compgen 셸 내장 명령으로 목록 확인하기
터미널에 compgen -c | more라고 입력하면 실행 가능한 모든 명령어가 화면에 나열됩니다. 스페이스바를 누를 때마다 다음 페이지로 넘어갈 수 있습니다. 참고로 이 유틸리티는 '명령어'의 범위를 매우 넓게 잡기 때문에, 일반적으로 명령어라고 생각하지 않는 특수문자들도 함께 출력됩니다. 이런 기호들은 긴 명령어들을 서로 연결하는 용도로 쓰이기 때문에 단독으로 입력하면 실행되지 않습니다.
최신 터미널 에뮬레이터를 사용하고 있다면 화면에서 사라진 내용은 언제든 스크롤을 올려 다시 확인할 수 있습니다. 원하는 명령어를 찾았다면 q 키를 한 번만 누르면 바로 명령 프롬프트로 돌아옵니다. compgen은 bash 내장 명령이므로 Almquist 셸이나 C 셸에서는 사용할 수 없다는 점에 유의하세요.
compgen은 몇 가지 추가 옵션도 제공합니다. 셸 내장 명령이다 보니 man 페이지가 없어 사용법을 파악하기 어려울 수 있지만, 옵션 자체는 외우기 어렵지 않습니다.
- compgen -a : 설정된 모든 별칭(alias) 목록 출력
- compgen -b : 모든 셸 내장(built-in) 명령 목록 출력
- compgen -k : 셸 예약 키워드(keyword) 목록 출력
명령어에 대해 더 자세히 알고 싶다면 man builtins를 입력하여 bash 셸 매뉴얼 페이지를 열어보세요. bash가 스스로 처리할 수 있는 모든 기능을 설명하기 때문에 페이지가 상당히 깁니다. 여기서 /compgen을 입력하고 Enter를 누르면 해당 항목을 검색할 수 있습니다. 처음에는 첫 번째 언급 부분만 강조되므로 /를 입력한 뒤 다시 Enter를 누르면 compgen의 역할을 설명하는 단락을 만나게 됩니다.
참고로 compgen -c와 마찬가지로 compgen -b | more처럼 more를 함께 사용해야 결과가 화면 밖으로 흘러내리는 것을 막을 수 있습니다. 나머지 옵션들은 출력량이 많지 않습니다. 그래도 최신 터미널 에뮬레이터를 사용한다면 출력이 화면을 넘어가도 스크롤을 올려 언제든 확인할 수 있습니다.
방법 2: 탭 키 자동완성 트릭 활용하기
bash 프롬프트에서 탭(Tab) 키를 두 번 누르면 제안 목록이 나타나는 기능을 이미 알고 있을 것입니다. 명령어를 일부만 입력한 후 탭 키를 누르면 나머지 부분이 자동으로 완성됩니다. 대부분의 사용자는 이 기능을 활용해 긴 디렉터리 경로로 이동하거나 이름이 긴 파일을 일일이 입력하지 않고도 삭제하는 등의 작업을 편하게 처리하고 있습니다.
특정 명령과 조합하면 이 트릭으로 시스템의 모든 명령어를 확인할 수도 있습니다. bash --norc를 입력하고 Enter를 눌러 가장 기본적인 형태의 bash 세션을 시작하세요. 대부분의 배포판은 기본 설정에서 이 기능(탭 두 번 제안)을 비활성화해 두기 때문입니다. 프롬프트가 평범한 형태로 바뀐 것이 보일 것입니다. 이제 아무것도 입력하지 않은 상태에서 탭 키를 두 번 누릅니다.
'모든 가능성을 표시할까요?'라는 확인 메시지가 나타나면 y 키를 누릅니다. 그러면 시스템에 있는 모든 명령어 목록이 표시됩니다. 원하는 명령어를 찾았다면 q 키를 눌러 빠져나오세요. 이 목록은 지금까지 보아 온 다른 bash 제안 목록과 동일하게 작동하므로 같은 방식으로 문제없이 탐색할 수 있습니다. 앞선 방법과 달리 파이프(|)로 다른 명령에 연결하지 않아도 알파벳순으로 정렬되어 있다는 점이 장점입니다.
새 세션을 종료하고 싶다면 exit를 입력하면 됩니다. 그러면 원래의 명령 프롬프트로 돌아갑니다.
작성자 소개

Kevin Arrows
Kevin Arrows는 10년 이상의 업계 경력을 지닌 베테랑 기술 전문가로, Microsoft Certified Technology Specialist(MCTS) 자격증을 보유하고 있습니다. 최신 기술 동향을 꾸준히 학습하는 것에 큰 열정을 가지고 있으며, 소프트웨어 개발, 사이버 보안, 클라우드 컴퓨팅 등 다양한 기술 분야의 주제에 대해 폭넓게 집필해 왔습니다. 복잡한 기술 개념을 명확하고 간결하게 설명하는 능력으로 동료들에게 널리 인정받고 있는 필자입니다.