일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 투자
- 서평
- 알고리즘트레이닝
- 자바
- 자바스크립트
- 주식
- 프로그래머스 알고리즘 공부
- 독후감
- algorithmTest
- 돈
- C++
- JavaScript
- 재테크
- 책을알려주는남자
- 성분
- 다독
- 채권
- 백준알고리즘
- 화장품
- 지혜를가진흑곰
- Java
- 독서
- 경제
- 책알남
- algorithmtraining
- algorithmStudy
- 알고리즘 공부
- 프로그래밍언어
- 알고리즘공부
- C
- Today
- Total
탁월함은 어떻게 나오는가?
[Computer Science] CLI란? (Command-line interface, 명령 줄 인터페이스) 그리고 셸(Shell)과 터미널(Terminal)에 대해서도 알아보자 본문
[Computer Science] CLI란? (Command-line interface, 명령 줄 인터페이스) 그리고 셸(Shell)과 터미널(Terminal)에 대해서도 알아보자
Snow-ball 2022. 11. 10. 10:59명령 줄 인터페이스 또는 명령어 인터페이스는 가상 터미널 또는 터미널을 통해 사용자와 컴퓨터가 상호 작용하는 방식을 뜻한다. 즉, 작업 명령은 사용자가 컴퓨터 키보드 등을 통해 문자열의 형태로 입력하며, 컴퓨터로부터의 출력 역시 문자열의 형태로 주어진다.
- 위키백과 -
CLI의 대표적인 예시
도스, 명령 프롬포트(window cmd), bash로 대표되는 유닉스 셸 환경이 있다. macOS에서는 Terminal, widnows의 Windows Terminal 등이 있다.
사용 이유와 누가 사용하나?
거의 모든 운영체제에서는 GUI(Graphic User Interface)를 지원한다. 우리가 흔하게 쓰는 윈도우 화면에서 더블클릭이 GUI의 환경이다. 그에 비해서일반적으로 CLI 환경은 불친절한 환경으로 여겨진다. CLI 환경에 익숙해지려면 기본적인 명령어들을 외워야 하는 것부터 난관인데, 깊게 들어갈수록 프로그래밍과 관련 있는 파이프 및 셸 스크립트까지 내려가기 때문에 배워야 할 게 끝이 없다. 처음 접하게 되면 무슨 말인지 모르는 문자열들이 출력되면서 어렵게 느껴지지만, 사용하다보면 편하다는것이 정설이다.
그래픽 사용자 인터페이스(graphical user interface, GUI)는 사용자가 편리하게 사용할 수 있도록 입출력 등의 기능을 알기 쉬운 아이콘 따위의 그래픽으로 나타낸 것이다. 컴퓨터를 사용하면서, 화면 위의 물체나 틀, 색상과 같은 그래픽 요소들을 어떠한 기능과 용도를 나타내기 위해 고안된 사용자를 위한 컴퓨터 인터페이스이다. 그래픽 사용자 인터페이스에서 어떤 요소를 제어하려면 그 요소에 해당하는 그래픽을 직접 조작하여야 한다. 일반적으로 2차원의 공간에서 그 기능을 은유적 혹은 대표적으로 나타내는 그래픽으로 요소를 꾸미고 이를 선택, 이동, 복사하여 작동한다. 이를테면, X자와 같은 형태의 그래픽 요소는 이를 선택하면 삭제하거나 취소하는 기능을 수행하게 되며 어떤 파일을 나타내는 아이콘을 어느 위치에서 다른 하드 디스크의 장소를 나타내는 공간으로 이동하면 복사가 된다. 컴퓨터 자판의 명령어 입력이 요구되는 명령 줄 인터페이스(CLI)의 가파른 학습 곡선에 대응하여 GUI가 도입 되었다. GUI의 동작은 일반적으로 그래픽 요소의 직접 조작을 통해 수행된다.
- 위키백과 -
그럼에도 불구하고 당연히 대부분의 사람들은 키보드 및 마우스를 통하여 접근하는 직관적인 GUI를 선호할 수 밖에 없다. 이 때문에 CLI는 최종 사용자 수준에서는 GUI로 완전히 대체되었으며, 아직까지 CLI가 남아있는 분야는 서버 관리 및 서버 프로그래밍처럼 프로그래밍과 접점이 닿아있는 부분이다.
불편하기만 해 보이는 CLI가 아직까지 남아있는 이유는 GUI가 대체할 수 없는 CLI만의 장점 때문이다. 일단 사용하는 사람이 최종 사용자가 아닌 충분히 교육된 사람이기에 진입장벽이 크게 문제가 되지 않으며, 자원을 적게 잡아 먹으면서 안정적이고 빠르다. 게다가 원격으로 작업할 대 웬만한 네트워크 환경에서도 안정적으로 작업할 수 있으며 사용되는 데이터 양 역시 압도적으로 적다. 특히 서버 쪽에서는 작업 자동화와 원격 작업이 필요한 경우가 많은데 CLI는 이 분야에서 압도적인 효율을 보여준다.
주로 리눅스 커뮤니티 쪽이 이런 CLI 환겨에 익숙한 편이다. 이런 사람들은 GUI 윈도우 매니저 위에 '터미널 에뮬레이터'를 이용하여 CLI를 부분적으로 통합시켜서 쓴다. 윈도에서 cmd나 COMMAND.COM을 띄워 놓고 사용한다고 생각 하면 된다. 물론 차이는 엄청나다. 퍼포먼스가 더 좋은 경우가 많다. 특수 글꼴과 다양한 색상을 적용시켜 터미널을 알록달록하게, 그리고 가독성 좋게 만들 수 있다. 특히 macOS에서 돌아가는 iTerm2는 이 분야의 최강자 라고 한다.
CLI 작동방식
CLI는 크게 2개 단위로 구성 되어 있다. "입력"과 "출력"이다.
우리는 이런 입출력이 가능하게 해주는 소프트웨어나 하드웨어를 터미널(terminal)이라고 한다. 또한, 사용자가 입력한 명령어를 해석해 주는 소프트웨어를 셸(shell)이라고 한다.
사용자가 특정 명령어를 통해 "입력"을 하게 되면(보통 엔터키를 입력하여 명령을 종료한다), Shell 프로그램이 입력 받은 명령어를 해석하고 명령에 해당하는 적절한 내용을 터미널에 출력 해준다.
터미널(Terminal)이란?
터미널(Terminal, 단말기)은 입력과 출력이 가능한 하드웨어 장비를 의미하며, 콘솔이라고도 부른다. 좀 더 정확히는 운영체제 커널과 연결가능한 문자 입출력 기능을 가진 물리 장비를 의미한다. 그렇지만 현재 시점에서 물리 하드웨어를 지칭하는 단어로는 거의 사용되지 않는다.
리눅스, 맥OS에는 터미널이라는 애플리케이션이 기본적으로 제공된다. 이 터미널은 물리 하드웨어를 소프트웨어로 구현한 애플리케이션이다. 그래서 터미널이라고도 하지만, 가상 터미널 혹은 터미널 에뮬레이터라는 이름이 더 정확한 표현이다. 즉, 입출력이 가능한 가상 터미널과 OS 커널을 연결해, 컴퓨팅(연산 작업)을 수행할 수 있다. 대부분의 리눅스, 맥OS, 윈도의 터미널 애플리케이션들은 문자열 입출력만이 가능하다.
터미널은 그 자체로 문자 사용자 인터페이스라고 할 수 있다. 좀 더 좁은 의미에서 보자면, 셸과 같이 명령을 기반으로 하는 프로그램이 주로 사용되기 때문에 커맨드라인(명령줄) 인터페이스라고도 한다.
대표적은 프로그램으로는 윈도의 명령 프롬프트와 윈도 터미널(Windows Terminal)이 있다. 명령 프롬프트는 윈도우 독자적인 가상 터미널으로 불편한 점이 많았다. 최근에 출시된 윈도 터미널은 cmd, 파워셸, WSL2(리눅스)를 모두 지원하는 터미널로 훨씬 더 다양한 기능들이 구현되어 있다.
셸(Shell)이란?
셸은 커맨드라인 인터페이스로 구현된 가장 대표적인 프로그램이다. 셸은 특정한 목적을 가지고 실행되는 프로그램이라기보다, 컴퓨터에 명령을 내리기 위한 인터페이스 역할을 한다. 커맨드라인(명령줄)이라는 표현은 셸 자체를 지칭한다고 해도 무방하다.
터미널을 통해서 커맨드라인 인터페이스로 구현된 프로그램들을 직접 실행할 수 있지만, 대부분의 경우 기본적으로 셸(Bash)이 실행되도록 설정되어있다.
셸 자체에도 내장 기능들이 많이 있지만, 기본적으로 셸은 다른 커맨드라인 프로그램들을 실행하는 용도로 사용된다. 즉, 터미널이나 커맨드라인 인터페이스를 배우는 일은 이러한 프로그램들을 배우는 일이라고 할 수 있다. 한 발 더 나아가면 셸의 기능들을 활용하거나 셸로 복잡한 스크립팅을 하는 것도 가능하다.
셸과 REPL (Read-Eval-Print Loop)
셸의 구현에 대해서 REPL이라고도 한다. REPL은 Read-Eval-Print Loop 의 줄임말로 사용자가 입력한 명령어를 읽어 들이고(Read), 평가하고(Eval), 결과를 출력(Print) 과정을 반복(Loop)하느 명령줄 인터페이스의 특징을 잘 나타낸다. 셸은 리눅스 환경에서 사용하는 가장 기본이 되는 프로그램이지만, 셸 뿐만 아니라 루비의 irb, 파이썬의 python 명령어 등 스크립트 언어들의 REPL 방식으로 구현된 인터렉티브 환경을 제공한다. R이나 SASS와 같은 통계 애플리케이션들은 GUI 애플리케이션이면서 동시에 커맨드라인 환경을 포함하고 있다.
셸에도 다양한 종류가 이다. Bash 셸은 리눅스 환경에서 표준이라고 할 수 있다. Bash는 원래 본 셸을 대체하기 위한 GNU 프로젝트로 브라이언 폭스에 의해 처음 개발되어, 1989년 첫 버전이 공개되었다. 편의 기능 때문에 다른 셸을 사용하더라도 셸 스크립팅은 Bash로 하는 게 일반적이다. Bash와 함께 가장 많이 사용 되는 Zsh은 폴 팔스타드가 처음 개발한 셸로 1990년에 최초로 공개되었다. Bash와 Zsh은 크게 다르지는 않지만, 기본 설정상 Zsh이 좀 더 사용자 친화적이며 Oh My Zsh과 같은 설정 프레임워크가 인기를 끌면서 많이 사용되고 있다. 명령어 제안이나 자동완성이 강화되고 쉬운 스크립팅을 강조하는 Fish 셸도 있다.
셸과 SSH의 차이
커맨드라인 인터페이스가 일반화 되어있는 환경이 하나 있다면 바로 서버 컴퓨터이다. 리눅스 서버 환경에서는 일반적으로 그래피컬 유저 인터페이스(GUI)를 포함하지 않는다. 따라서 서버 컴퓨터에는 기본적으로 가상 터미널이 할당되어 있으며 동작중인 컴퓨터에 모니터와 키보드를 연결하고, 로그인을 하면 셸이 실행된다.
서버 컴퓨터에 직접 입출력 장치를 연결하기도 하지만, 더 일반적인 방법은 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의 역할을 나눠서 생각해보자.
referance