커맨드라인 인터페이스, 셸, 터미널이란?

커맨드라인 인터페이스란?

커맨드라인 인터페이스에 대한 개념도

커맨드라인 인터페이스(Command-line Interface, CLI)란 사용자가 텍스트로 명령어를 입력하고 다시 텍스트로 결과를 화면에 출력해주는 인터페이스를 가진 컴퓨팅 인터페이스를 의미합니다. 좁은 의미에서 커맨드라인(명령줄)에서 명령을 입력한다는 의미로 쓰입니다만, 넓은 의미에서는 텍스트만으로 이루어진 인터페이스라는 뜻에서 문자 사용자 인터페이스(Character User Interface, CUI)라고도 불립니다. 커맨드라인 인터페이스는 구체적인 프로그램을 가리키는 단어는 아니며, 특정 방식의 애플리케이션 인터페이스에 대한 통칭입니다.

MS-DOS나 리눅스Linux 초기의 컴퓨팅 환경은 텍스트 기반의 CLI가 유일한 사용자 인터페이스였습니다만, 현재는 그래픽 사용자 인터페이스(Graphical User Interface)가 더 보편적으로 사용되고 있습니다. 그럼에도 불구하고 개발 환경이나 서버 관리 용도로는 여전히 커맨드라인 인터페이스가 많이 사용되고 있습니다. GUI는 사용자들에게 친숙하고 직관적이라는 장점이 있습니다만, 애플리케이션 간에 입출력을 전달하거나 자동화하는 작업은 번거로운 편입니다. 또한 GUI 애플리케이션 개발에 드는 초기 비용이 매우 큰 편입니다. 이에 반해서 커맨드라인 인터페이스는 프로세스간 입출력 전달이나 자동화에 최적화되어있으며, 텍스트 입출력만으로 프로그램을 작성할 수 있기 때문에 개발이 매우 간편합니다. 이런 이유로 많은 개발 도구들은 커맨드라인 인터페이스를 기본적으로 채용하고 있습니다.

개발 언어나 개발 환경에 따라 일률적이지는 않습니다만, 스크립트 언어나 서버 개발, 서버 운영 등에 있어서는 커맨드라인 인터페이스를 활용하는 스킬이 필수적이라고 할 수 있습니다. 또한 개발자들이 선호하는 맥OSmacOS는 BSD 기반의 운영체제로 리눅스와 거의 비슷한 커맨드라인 환경을 사용할 수 있습니다. 윈도Microsoft Windows에서도 파워셸 등으로 커맨드라인을 강화하고 있으며, 윈도 터미널을 출시하고 WSLWindows Subsystem for Linux를 지원하는 등 커맨드라인 인터페이스 환경을 개선해나가고 있습니다. 윈도에서 리눅스 환경을 바로 사용할 수 있는 WSL2에 대한 정보는 다음 글을 참고해주세요.

44BITS 로고

WSL2(Windows Subsystem for Linux 2) 설치 및 사용 방법

🗒 기사, 2020-06-15 - 지난 5월 윈도우10의 대규모 업데이트가 있었습니다. 이번 업데이트에는 WSL2 정식 릴리스가 포함되어있습니다. WSL은 경략 가상화 기술을 통해 윈도우에서 리눅스 배포판을 사용할 수 있게 도와주는 기능으로, WSL2는 WSL에 비해서 획기적인 성능 개선이 있었습니다. 이 글에서는 WSL2를 설치하고 기본적인 사용 방법에 대해서 소개합니다.

커맨드라인은 매우 강력합니다만, 정말로 텍스트만으로 모든 인터페이스를 구현하고 처리합니다. 이미지 출력은 불가능하고, 매우 많은 관습들이 자연스럽게 녹아있기 때문에 입문하기는 쉽지 않은 편입니다. 맥OS와 리눅스 기반의 커맨드라인 기초에 대해서는 다음 글에서 다루고 있습니다.

44BITS 로고

커맨드라인 사용법: 따라하며 배우는 리눅스 명령어와 관습들

🗒 기사, 2021-01-29 - 프로그래밍이나 서버에 대해서 공부하다 보면 필연적으로 커맨드라인 인터페이스도 함께 입문하게 됩니다. 커맨드라인 인터페이스는 아주 강력하지만, 다양한 관습들과 전제들이 존재하고 있어서 입문자들에게는 쉽지 않은 것이 현실입니다. 이 글에서는 바로 이러한 커맨드라인 인터페이스와 셸의 기초와 관습들에 대해서 소개하고자 합니다. 부디 커맨드라인 입문길이 즐거운 여정이 되기를 기원합니다.
44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

터미널(Terminal)이란?

터미널(Terminal, 단말기)은 입력과 출력이 가능한 하드웨어 장비를 의미하며, 콘솔이라고도 부릅니다. 좀 더 정확히는 운영체제 커널과 연결가능한 문자 입출력 기능을 가진 물리 장비를 의미합니다만, 현재 시점에서 물리 하드웨어를 지칭하는 단어로는 거의 사용되지 않습니다.

리눅스, 맥OS에는 터미널이라는 애플리케이션이 기본적으로 제공됩니다. 이 터미널은 물리 하드웨어를 소프트웨어로 구현한 애플리케이션입니다. 그래서 터미널이라고도 하지만, 가상 터미널 혹은 터미널 에뮬레이터라는 이름이 더 정확한 표현입니다. 즉, 입출력이 가능한 가상 터미널과 OS 커널을 연결해, 컴퓨팅(연산 작업)을 수행할 수 있습니다. 대부분의 리눅스, 맥OS, 윈도의 터미널 애플리케이션들은 문자열 입출력만이 가능합니다.

맥OS 터미널에서 tty라는 명령어를 실행해보면 현재 커널과 연결된 가상 터미널 장치 이름을 확인할 수 있습니다.

tty 명령어로 가상 터미널 장치를 확인해볼 수 있습니다

따라서 터미널은 그 자체로 문자 사용자 인터페이스라고 할 수 있습니다. 좀 더 좁은 의미에서 보자면, 셸과 같이 명령을 기반으로 하는 프로그램이 주로 사용되기 때문에 커맨드라인(명령줄) 인터페이스라고도 합니다.

대표적인 프로그램으로는 윈도의 명령 프롬프트와 윈도 터미널(Windows Terminal)이 있습니다. 명령 프롬프트는 윈도우 독자적인 가상 터미널으로 불편한 점이 많았습니다. 최근에 출시된 윈도 터미널은 cmd, 파워셸, WSL2(리눅스)를 모두 지원하는 터미널로 훨씬 더 다양한 기능들이 구현되어있습니다. 맥OSmacOS에서는 기본 터미널과 함께 아이텀2(iTerm2)가 많은 사랑을 받고 있습니다. 프론트엔드 개발로 유명한 Vercel에서 만든 일렉트론 기반의 Hyper라는 가상 터미널 애플리케이션도 있습니다.

셸(Shell)이란?

셸은 커맨드라인 인터페이스로 구현된 가장 대표적인 프로그램입니다. 셸은 특정한 목적을 가지고 실행되는 프로그램이라기보다, 컴퓨터에 명령을 내리기 위한 인터페이스 역할을 합니다. 커맨드라인(명령줄)이라는 표현은 셸 자체를 지칭한다고 해도 무방합니다.

터미널을 통해서 커맨드라인 인터페이스로 구현된 프로그램들을 직접 실행할 수 있습니다만, 대부분의 경우 기본적으로 셸(Bash)이 실행되도록 설정되어있습니다. 화면에서 보이는 대로 bash-3.2$는 프롬프트라고 불리며 한칸 띄어진 위치에 커서가 위치합니다. 커서는 터미널에서 키보드에 입력한 내용이 입력되는 위치입니다.

터미널을 실행하면 셸이 실행됩니다

여기서 적절한 프로그램명 인자들을 입력하고 엔터를 누르면, 셸이 해당 프로그램을 실행하고 그 결과를 화면에 출력해줍니다.

uname 명령어를 실행한 화면

이 화면에서 uname -a는 직접 입력한 문자열입니다. uname은 시스템의 정보를 출력해주는 프로그램입니다. 입력 후에 엔터를 입력하면 현재 시스템의 정보를 출력하고, 다시 프롬프트가 나타납니다. 여기에 다음 명령어를 입력할 수 있습니다. 이렇게 보면 왜 터미널이나 셸을 커맨드라인(명령줄) 인터페이스라고 부르는지 알 수 있습니다.

셸 자체에도 내장 기능들이 많이 있습니다만, 기본적으로 셸은 다른 커맨드라인 프로그램들을 실행하는 용도로 사용합니다. 즉, 터미널이나 커맨드라인 인터페이스를 배우는 일은 이러한 프로그램들을 배우는 일이라고 할 수 있습니다. 한 발 더 나아가면 셸의 기능들을 활용하거나 셸로 복잡한 스크립팅을 하는 것도 가능합니다.

셸과 REPL(Read-eval-print loop)

셸의 구현에 대해서 REPL이라고도 합니다. REPL은 Read-eval-print loop의 줄임말로 사용자가 입력한 명령어를 읽어들이고(Read), 평가하고(eval), 결과를 출력하는(print) 과정을 반복(loop)하는 명령줄 인터페이스의 특징을 잘 나타내줍니다. 셸은 리눅스 환경에서 사용하는 가장 기본이 되는 프로그램입니다만, 셸 뿐만 아니라 루비의 irb, 파이썬의 python 명령어 등 스크립트 언어들의 REPL 방식으로 구현된 인터렉티브 환경을 제공합니다. R이나 SASS와 같은 통계 애플리케이션들은 GUI 애플리케이션이면서 동시에 커맨드라인 환경을 포함하고 있기도 합니다.

GUI 환경에서 CLI로 명령을 입력받는 R

셸에도 다양한 종류가 있습니다. Bash 셸은 리눅스 환경에서 표준이라고 할 수 있습니다. Bash는 원래 본 셸을 대체하기 위한 GNU 프로젝트로 브라이언 폭스에 의해 처음 개발되어, 1989년 첫 버전이 공개되었습니다. 편의 기능 때문에 다른 셸을 사용하더라도 셸 스크립팅은 Bash로 하는 게 일반적입니다. Bash와 함께 가장 많이 사용 되는 Zsh은 폴 팔스타드가 처음 개발한 셸로 1990년에 최초로 공개되었습니다. Bash와 Zsh은 크게 다르지는 않습니다만, 기본 설정상 Zsh이 좀 더 사용자 친화적이며 Oh My Zsh과 같은 설정 프레임워크가 인기를 끌면서 많이 사용되고 있습니다. 명령어 제안이나 자동완성이 강화되고 보다 쉬운 스크립팅을 강조하는 Fish 셸도 있습니다.

셸과 SSH의 차이

커맨드라인 인터페이스가 일반화 되어있는 환경이 하나 있다면 바로 서버 컴퓨터입니다. 리눅스 서버 환경에서는 일반적으로 그래피컬 유저 인터페이스를 포함하지 않습니다. 따라서 서버 컴퓨터에는 기본적으로 가상 터미널이 할당되어있으며 동작중인 컴퓨터에 모니터와 키보드를 연결하고, 로그인을 하면 셸이 실행됩니다.

서버 컴퓨터에 직접 입출력 장치를 연결하기도 합니다만, 더 일반적인 방법은 SSH Server를 사용하는 것입니다.* 리눅스 서버의 경우 외부에서 접속이 가능하도록 SSH Server를 서비스로 등록해두는 것이 일반적입니다. ID/Password나 SSH 키를 발급해서 인터넷이나 내부망으로 연결된 다른 컴퓨터에서 서버 컴퓨터에 접속하는 것이 가능합니다. 이 때 외부 컴퓨터에서는 전용 SSH 클라이언트를 사용하거나 가상 터미널 애플리케이션에서 ssh 명령어로 서버 컴퓨터에 접속합니다.

* SSH은 Secure Shell의 줄임말입니다만, 엄밀하게 말해서 Bash와 같은 셸 프로그램은 아닙니다.

가상 터미널로 로컬 머신에서 셸을 실행하는 것과 SSH 클라이언트로 SSH 서버 측 컴퓨터에서 셸을 실행하는 것은 약간의 차이가 있습니다. 앞에서 잠깐 살펴본 것처럼 가상 터미널로 로컬 머신에 셸을 실행할 때는 tty 장치가 할당됩니다. 이 때는 터미널 앱 자체가 tty라고 할 수 있습니다. 이와 달리 ssh로 원격 장치에 접속할 때는 원격 장치에 pty(pseudo tty)가 생성됩니다. 즉, 의사 터미널 장치인 pty 장치에 Bash와 같은 실행시키고 SSH를 통해서 원격 장치의 입력을 전달하거나, 실행된 결과(pty에 출력되는 내용)를 SSH 클라이언트 쪽에 다시 전달하는 방식으로 동작합니다. 셸과 SSH의 역할을 나눠서 생각해보면 이해에 도움이 됩니다.

커맨드라인 인터페이스를 잘 활용하는 도구들

셸은 커맨드라인 인터페이스를 구현한 대표적인 프로그램입니다만, 셸 못지 않게 커맨드라인 환경을 잘 사용하는 다른 프로그램들도 있습니다. MS-DOS 시절부터 컴퓨터를 사용해오셨다면 Mdir을 기억하실 겁니다. Mdir도 대표적인 커맨드라인 인터페이스를 잘 활용한 애플리케이션 중 하나입니다. 이런 애플리케이션들이야 말로 명령줄 인터페이스보다는 문자 사용자 인터페이스(Character User Interface, CUI)라는 단어가 어울릴 듯 합니다.

Mdir III 3.07

독자적인 CUI를 구현하는 대표적인 프로그램으로는 nano, Emacs, Vim과 같은 텍스트 에디터가 있습니다. 특히 서버 환경에서 파일 편집을 하는 경우 GUI 애플리케이션을 사용할 수 없기 때문에 CUI 기반의 텍스트 에디터 하나 쯤 다루는 능력은 서버 운영자에게 필수적인 스킬로 요구되기도 했습니다. 일부 개발자들은 이러한 CUI 텍스트 에디터들의 강력함에 반해서 GUI 기반의 IDE보다도 Emacs나 Vim을 선호하기도 합니다.*

* Emacs나 Vim을 따로 배워서 사용하기 전에는 매우 사용하기가 어렵습니다. 급하게 CLI 환경에서 텍스트를 편집할 일이 있다면 nano가 가장 간편합니다.

텍스트 에디터 Emacs

셸에서 증분 검색 기반으로 검색 인터페이스를 확장해주는 fzfPeco와 같은 도구도 있습니다. CUI 환경을 다루는 라이브러리로는 GNU Readline이 대표적이며, 루비의 tty 젬은 커맨드라인 애플리케이션의 인터페이스를 라이브러리로 제공해줍니다. 44BITS에서도 Peco를 소개한 적이 있으니 참고해주세요.

44BITS 로고

Peco 사용법: 커맨드라인 텍스트 증분검색 필터링 도구

🗒 기사, 2015-12-09 - 페코(peco)는 커맨드라인 인터페이스에서 입력받은 텍스트 데이터에 대해서 증분검색을 수행하는 도구입니다. 페코는 파일 탐색이나 다른 프로세스의 출력 결과를 탐색하는 데 도움이 될 뿐만 아니라 셸의 사용성을 개선하는 데도 큰 도움이 됩니다. 이 글에서는 페코의 기본적인 사용법과 셸에서 입력한 명령어 히스토리를 증분검색으로 탐색하는 방법을 소개합니다.