공통기초 프로그래밍 개념 잡기

3. 터미널과 CLI

이번 강좌에서는 프로그램 개발을 위해 필수적인 터미널 사용법과 텍스트 기반의 명령 입력을 통해 컴퓨터를 조작하는 CLI에 대해 배우게 됩니다.

이 강의를 통해 개발과정에서 필요한 터미널 사용법을 익히고 CLI를 통해 프로젝트를 설정하거나 프로그램을 설치하고 관리할 수 있습니다.


01: 터미널과 쉘

1) 터미널(Terminal)

터미널은 원래 유닉스 기반의 대형 컴퓨터에서 사용자들이 컴퓨터에 접속하기 위해 사용했던 단말기를 의미 합니다. 즉 하나의 컴퓨터를 케이블로 연결해 여러명이 접속해 사용하는 방식이었습니다. 각각의 터미널은 대부부은 특별한 기능은 없고 모니터와 키보드를 가지고 있었으며 나중에는 확장되어 프린터나 마우스등이 연결되는 형태로 까지 발전 했습니다.

지금은 개인용 컴퓨터를 사용하기 때문에 더이상 과거와 같은 터미널을 사용하지는 않습니다. 대신 원격으로 컴퓨터에 접속하거나 혹은 명령어입력을 통해 컴퓨터를 직접 제어 하기 위해 사용하는 소프트웨어를 터미널 혹은 콘솔(Console) 이라고 합니다.

모든 운영체제는 기본적인 터미널 프로그램을 내장하고 있으며 전문적으로 만들어진 별도 프로그램도 많이 개발되어 있습니다. 지금과 같은 GUI(Graphical User Interface)가 보편화되기 이전에는 터미널을 통해 컴퓨터를 조작하는 CLI(Command Line Interface)를 주로 사용 했으며 GUI가 사용되면서 CLI의 사용은 급속도로 감소 했습니다.

다만 유닉스 계열에서는 아직도 CLI를 더 많이 사용하고 PC의 경우에도 최근에는 개발에 필요한 소프트웨어를 설치하고 모듈을 관리하고 프로젝트 구조를 생성하거나 github 를 통해 공유하는 과정에서 CLI 사용이 급증하고 있는 추세 입니다.

최근 파이썬, 루비, node, github 등의 사용이 많은데 이들을 사용하기 위해 CLI가 주로 사용되고 있습니다. GUI환경의 개발도구등에서도 모두 지원가능한 기능이지만 CLI가 더 신속하고 편리하기 때문에 최신개발을 위해서는 CLI에 익숙해 져야 합니다.

다음은 CLI 사용 예 입니다.

$ npm install ..
$ git remote add origin https://github.com/username/myproject.git
$ gem install ..

2) 쉘(Shell)

은 조개 껍데기의 의미로 터미널을 사용하기 위한 소프트웨어 환경을 말합니다. 예를 들어 키보드 입력과 명령을 실행할 수 있도록 해주고 디렉토리의 이동과 피일의 생성등을 지원하며 필요시 스크립트 작성을 지원해 복잡한 작업을 한번에 처리할 수 있도록 하는등의 기능을 제공합니다.

유닉스 사용을 위해 제일 처음 배우는 것이 바로 쉘 이며 쉘역시 소프트웨어 이므로 여러 종류의 쉘이 존재 합니다. 쉘에 따라 명령어 자동완성이나 텍스트 강조 등 여러 기능에 차이가 있을 수 있습니다.

유닉스 쉘 종류

sh, ksh, csh, bash 등이 대표적 입니다.

Mac OS 쉘

맥은 기본적으로 유닉스 커널을 사용하고 있으며 POSIX를 공식적으로 지원하고 있습니다. 따라서 일반적인 유닉스와 동일한 환경이 보장된다고 볼 수 있습니다.

윈도우즈 쉘

윈도우즈는 과거 DOS 에서 부터 이어져 오는 cmd(command) 프로그램이 쉘이라고 할 수 있습니다. 지금은 Power shell 이 윈도우의 기본 쉘 입니다. 유닉스 호환 쉘을 사용하려면 최신 윈도우10 업데이트에 개발자 모드를 활성화 하고 리눅스 서브시스템 추가기능 사용을 설정해 주어야 합니다.

3) POSIX(Portable Operating System Interface X(Unix))

POSIXIEEE가 제정한 유닉스 운영체제의 공통 API 규격으로 이식성이 높은 유닉스 응용프로그램을 개발하기 위한 규격 입니다. 이 규격을 따르면 유닉스와 직접적인 연관이 없어도 유닉스 호환(Unix-like) 운영 체제라고 볼 수 있습니다. 리눅스의 경우 유닉스와는 별도로 개발되었지만 POSIX 표준을 거의 다 준수하기 때문에 리눅스는 유닉스 호환 운영 체제로 이야기 할 수 있는 것입니다.

유닉스 계열인 Darwin BSD에 기반하고 있는 macOS도 POSIX를 따르고 있으며 10.5 버전부터 POSIX 정식 인증을 받아 유닉스와 동일한 운영환경을 보장하고 있습니다.

윈도우즈의 경우 XP에서 POSIX 지원이 사라져 cygwin 이라는 프로그램을 이용해야 했으나 Windows 10 Anniversary Update에 들어서 WSL(Windows Subsystem for Linux)이라는 리눅스 서브시스템을 다시 탑재하여 POSIX 환경을 이용할 수 있게 되었습니다.

따라서 POSIX 를 지원하는 경우 윈도우, 맥, 리눅스 등에서 모두 동일한 명령어사용법으로 CLI를 사용할 수 있습니다.


02: CLI(Command Line Interface)

CLI는 윈도우 화면에서 마우스등을 이용해 컴퓨터를 조작하는 것이 아니라 터미널에서 텍스트로 컴퓨터를 조장하는 방식을 말합니다.

앞에서 언급한것 처럼 CLI를 사용하기 위해서는 터미널 프로그램이 필요 합니다. 리눅스와 맥은 기본 터미널을 사용하면 되고 개인 취향에 맞는 터미널 프로그램을 다운로드해서 사용해도 됩니다. Visual Studio Code 혹은 Elipse, IntelliJ 와 같은 개발도구들은 자체적으로 터미널 프로그램을 내장하고 있어 간단한 작업은 개발도구에서 제공하는 터미널을 써도 무방 합니다.

윈도우의 경우 기본 cmd 에서는 유닉스 명령어가 동작하지 않고 일부 다른 명령어를 사용하는 경우가 많습니다. 윈도우즈 Power Shell 의 경우 일부 유닉스 쉘 명령어가 동작하기 때문에 기본적인 사용은 Power Shell로 충분합니다. 강좌의 예제는 일부 옵션을 제외하고는 Power Shell 에서 모두 동작합니다.

만일 윈도우에서 본격적으로 리눅스 환경과 같이 CLI를 사용하고 싶다면 WSL(Window Subsystem for Linux)을 설치 해야 합니다. 제대로 사용하려면 리눅스에 대한 학습이 필요하기 때문에 당장 꼭 필요한 것이 아니라면 나중에 설치해도 됩니다.

1) WSL 설치

2) 기본 명령어

각각의 명령어는 세부 옵션들이 존재 하며 보자 자세한 옵션들은 해당 명령어 뒤에 --help 를 입력하면 됩니다(윈도우즈 파워쉘에서는 -?). 커맨드 라인 앞에 붙은 $ 표시는 쉘 프롬프트로 설정을 통해 다른 문자로 변경할수도 있고 컴퓨터이름이나 사용자 이름 디렉토리명 등을 함께 표시하도록 설정할수도 있습니다.

또한 이전에 사용한 명령어화살표 업/다운 키를 이용해 쉽게 찾을수 있으며 !명령어 혹은 일부단어 를 입력하면 가장 마지막에 실행한 동일 명령어가 사용했던 옵션과 함께 실행됩니다.

pwd: 현재 디렉토리 위치

현재 디렉토리가 어디인지 표시해 줍니다.

$ pwd
/home/username

ls: 디렉토리 목록 보기

현재 디렉토리의 목록을 보여줍니다.

$ ls
bin  boot  dev  etc  home  init  lib  lib64  media ..
$ ls -la
total 112
drwxr-xr-x  1 root root   4096 Jan 31 15:38 .
drwxr-xr-x  1 root root   4096 Jan 31 15:38 ..
drwxr-xr-x  1 root root   4096 Jan 31 15:38 bin
drwxr-xr-x  1 root root   4096 Jul 26  2018 boot
drwxr-xr-x  1 root root   4096 Jan 31 15:58 dev
drwxr-xr-x  1 root root   4096 Jan 31 15:57 etc
drwxr-xr-x  1 root root   4096 Jan 31 15:56 home
...

drwxr-xr-x 와 같은 표기는 해당 파일(디렉토리)에 대한 정보 입니다.d 는 디렉토리임을 의미하고 - 는 각각 root-그룹-사용자권한을 표시 합니다. r=읽기, w=쓰기, x=실행 권한을 각각 의미합니다.

root root 라고 표시된 것은 파일의 소유주그룹을 나타 냅니다.

cd: 디렉토리 이동 하기

디렉토리를 이동합니다. /: root디렉토리,./: 현재 디렉토리,../: 상위디렉토리 입니다. 서브 디렉토리는 디렉토리 이름만 쓰면 됩니다.

$ cd ../
$ cd ../../img
$ cd /usr/lib
$ cd img/banner  ==> cd ./img/banner 와 같음
$ cd /

/ 표시 다음에 탭 키를 입력하면 이동가능한 디렉토리 목록이 표시되거나 자동완성 됩니다.

cat: 파일내용보기(텍스트)

텍스트 파일의 내용을 보여주는 명령 입니다.

$ cat .bashrc
....
....

clear: 화면 지우기

현재 터미널 화면을 깨끗하게 지워줍니다.

$ ls
...
...
$ clear

rm: 파일및 디렉토리 삭제

파일이나 디렉토리를 삭제하는 명령 입니다. 기본적으로 삭제된 파일이나 디렉토리의 복구가 안되기 때문에 주의해서 사용해야 합니다. 디렉토리에 파일이 있을경우 rm 으로 삭제가 안되고 rm -r 해주어야 합니다.

$ rm hello.txt
$ rm -r img/

ps: 프로세스 조회

컴퓨터에 실행된 프로세스를 조회 할 수 있습니다.

$ ps
  PID TTY          TIME CMD
    4 tty1     00:00:00 bash
   35 tty1     00:00:00 ps

리디렉션과 파이프

리디렉션은 출력결과를 다른 출력스트림(예:파일)로 전달하는 것으로 > 혹은 >> 를 사용하며 파이프는 명령의 결과를 다른 명령과 연결하는데 사용하며 | 를 이용합니다.

$ ls > result.txt
$ pwd >> result.txt   -> 기존파일에 추가(append)
$ ls | more   -> 목록이 긴 경우 more 명령을 이용해 끊어 보여줌.