본문으로 건너뛰기

Linux 터미널과 쉘

Console & Terminal

예전의 콘솔 화면

예전의 콘솔 화면

콘솔(Console)은 컴퓨터 본체에 직접 연결된 입력·출력 장치를 뜻합니다. 예전에는 대형 컴퓨터나 서버를 동작할 때 지금처럼 전원 버튼을 누르면 자동으로 부팅되는 방식이 아니었습니다. 전원을 켜면 하드웨어 점검만 수행하고 멈추는 경우가 많았기 때문에 운영체제를 시작하려면 콘솔에 붙은 키보드로 직접 명령어를 입력해야 했습니다.

또한 부팅 과정에서 문제가 생기면 콘솔 화면에 에러 메시지가 그대로 출력되었기 때문에, 관리자가 에러 내용을 보고 즉각적으로 조치해야 했습니다. 지금처럼 원격 접속이 항상 가능한 환경이 아니었기 때문에, 콘솔은 그야말로 컴퓨터를 제어할 수 있는 유일한 창구이자 마지막 수단이었습니다.

지금도 서버에 모니터와 키보드를 직접 꽂아 운영체제가 부팅되는 과정을 살펴보거나, 문제가 생겼을 때 직접 조작할 수 있는 화면을 콘솔이라고 부릅니다. 가상머신이나 클라우드 환경에서도 비슷한 역할을 수행하는 소프트웨어를 콘솔 도구 등의 이름으로 제공합니다. 이런 콘솔 화면은 네트워크로 접속하는 SSH 터미널과 달리, 운영체제가 완전히 올라오기 전 단계부터 볼 수 있다는 점이 특징입니다.

최초의 터미널 장치, TTY (teletypewriter)

최초의 터미널 장치, TTY (teletypewriter)

터미널(Terminal)은 종점을 뜻하는 단어에서 유래했습니다. 지금은 대부분 한 사람이 한 대의 컴퓨터를 쓰지만, 예전에는 사무실 책상마다 화면과 키보드만 달린 작은 기계가 놓여 있었습니다. 이 기계를 통해 중앙 컴퓨터에 연결해서 여러 사용자가 동시에 접속해 작업했는데, 이 기계를 터미널이라고 불렀습니다.

이런 물리적인 터미널 장비는 컴퓨터와 사람 사이에서 일종의 인터페이스 역할을 했습니다. 콘솔과 달리 터미널은 여러 개를 동시에 연결해 여러 사람이 같은 시스템을 함께 사용하는 것을 전제로 만들어졌다는 점이 특징입니다.

Ubuntu의 터미널

Ubuntu의 터미널

지금은 콘솔과 터미널이라는 말이 과거처럼 엄격히 물리적인 장치를 구분해서 쓰이지 않습니다. 예전에는 콘솔은 컴퓨터 본체에 붙어 있는 기본 제어 장치였고, 터미널은 여러 사용자가 중앙 컴퓨터에 접속하는 문자 입력 장치였습니다. 그러나 현재는 대부분의 작업이 소프트웨어로 이루어지기 때문에, 이 둘의 개념이 크게 겹치게 되었습니다.

일반적으로 리눅스에서는 터미널이라고 하면 터미널 에뮬레이터를 뜻하는 경우가 많고, 물리적으로 직접 연결해 초기 부팅부터 조작할 수 있는 화면은 여전히 콘솔이라고 부릅니다. 하지만 사용자가 데스크톱 환경에서 터미널 프로그램을 실행하면, 사실상 콘솔과 터미널이 하던 역할을 함께 수행하게 됩니다. 운영체제가 올라온 뒤라면 콘솔도 소프트웨어로 가상화되어 표시되는 경우가 많습니다.

즉, 지금 우리가 쓰는 터미널 프로그램은 과거의 물리적 콘솔과 물리적 터미널이 했던 일을 하나의 창에서 모두 할 수 있는 인터페이스로 발전한 형태입니다. 이 창에서 텍스트를 입력하고, 시스템과 직접 대화하며, 필요할 경우 관리자 권한으로 제어도 할 수 있습니다. 콘솔과 터미널의 차이점은 개념적으로 구분할 수 있지만, 지금은 실무에서 두 용어를 거의 같은 의미로 사용하는 경우가 많습니다.

Shell

쉘(Shell)은 텍스트로 명령어를 입력할 수 있는 인터페이스(CLI)를 제공하며, 사용자가 입력한 명령어를 해석하고 실행하는 프로그램입니다. 터미널이 단순히 글자를 입력하고 결과를 보여주는 창이라면, 쉘은 그 안에서 이 명령어가 무슨 뜻인지 이해하고 처리하는 역할을 합니다. 또, 단순히 명령어를 실행하는 것뿐만 아니라, 여러 명령어를 한 번에 처리하는 스크립트를 작성하거나, 탭(Tab)키로 자동 완성을 지원하는 등의 편의 기능도 제공합니다.

즉, 사용자는 쉘을 통해 명령어를 입력하고 해당 명령어가 쉘에 의해 해석되어 커널(Kernel)로 전달됩니다. 커널에서는 각 명령을 실행하게 되고, 사용자는 출력되는 결과를 화면에서 바로 확인할 수 있습니다. 이처럼 쉘은 운영체제와 사용자의 중간에서 통역사 같은 일을 합니다.

쉘에도 여러 종류가 있는데 리눅스에서 가장 많이 쓰는 쉘은 Bash입니다. 리눅스를 설치하면 기본적으로 Bash가 설정되어 있어서 별도의 설정 없이 바로 사용할 수 있습니다. 이 밖에도 Zsh, PowerShell 등 다양한 쉘이 존재합니다.

Prompt

프롬프트(Prompt)는 쉘이 명령어를 기다리는 상태일 때 화면에 표시되는 짧은 문구입니다.

보통 프롬프트는 아래와 같은 모양으로 보입니다.

user@ubuntu:~$ # 일반 사용자 계정
root@ubuntu:/# # 관리자 계정

위의 예시는 현재 사용자가 user이고, ubuntu라는 컴퓨터를 쓰고 있으며, 홈 폴더에 위치하고 있다는 뜻입니다. 물결 표시(~)는 홈 폴더를 의미합니다. 가장 마지막에 붙어있는 달러 기호($)는 일반 사용자 계정이라는 의미이고, 샵(#) 기호가 붙으면 관리자 계정을 뜻합니다.

홈 폴더는 사용자 고유의 폴더로, 사용자마다 각각 따로 존재합니다. 아래와 같이 구성되어 있습니다.

  • Desktop : 바탕화면에 위치한 파일들을 저장하는 폴더입니다.
  • Documents : 문서 파일들을 저장하는 폴더입니다.
  • Downloads : 인터넷에서 다운로드한 파일들이 저장되는 폴더입니다.
  • Music : 음악 파일들을 저장하는 폴더입니다.
  • Pictures : 이미지 파일들을 저장하는 폴더입니다.
  • Public : 공용 폴더로, 모든 사용자가 접근할 수 있는 폴더입니다.
  • Templates : 새로운 파일을 생성할 때 사용할 수 있는 템플릿 파일을 저장하는 폴더입니다.
  • Videos : 동영상 파일들을 저장하는 폴더입니다.
관리자 권한(sudo)

프로그램을 설치, 또는 삭제하거나 컴퓨터의 전원을 끄는 등 잘못 수행하면 문제가 생길 수 있는 명령은 모두 관리자 권한으로 실행해야 합니다. 하지만 보안을 위해 관리자 계정은 기본적으로 비활성화되어 있기 때문에 관리자 계정으로 로그인하는 대신 필요한 순간에만 권한을 잠시 얻어 사용하는 방식을 씁니다.

명령어 앞에 sudo 명령을 붙이면 관리자 권한으로 실행되며, 실행 전 로그인한 사용자의 패스워드를 물어볼 수도 있습니다.

프롬프트는 명령어를 실행한 뒤 다시 나타나며, 쉘이 새로운 명령어를 받을 준비가 되었다는 것을 알려줍니다.

Ubuntu 명령어

우분투를 실제로 사용하기 위해선 다양한 명령어들과 익숙해지는 것이 좋습니다. 명령어는 억지로 암기하는 것보다 실습을 진행하며 직접 손에 익히는 것이 빠릅니다. 특히 자주 사용되는 아래의 명령어들은 반드시 자주 사용하며 익혀두도록 합니다.

파일 시스템

pwd : 현재 위치 조회

print working directory

$ pwd

/home/ubuntu

ls : 파일 목록 조회

list segments

  • ls -a : 숨김 파일(.으로 시작하는 파일) 포함
  • ls -l : 세부 정보 표시(권한, 링크 수, 소유자, 그룹, 파일 크기, 수정일, 파일명)
$ ls

build install log src

$ ls -a

. .. build install log src

$ ls -l

total 16
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 24 14:58 build
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 24 14:58 install
drwxr-xr-x 4 ubuntu ubuntu 4096 Jun 24 14:58 log
drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 10 14:34 src

$ ls -al

total 24
drwxr-xr-x 6 ubuntu ubuntu 4096 Jun 24 14:58 .
drwxr-x--- 9 ubuntu ubuntu 4096 Nov 26 10:42 ..
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 24 14:58 build
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 24 14:58 install
drwxr-xr-x 4 ubuntu ubuntu 4096 Jun 24 14:58 log
drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 10 14:34 src

cd : 디렉터리 이동

change directory

  • cd . : 현재 위치 이동
  • cd .. : 상위 폴더로 이동
  • cd / : 루트 경로로 이동
  • cd ~ : 홈 경로로 이동
$ pwd

/home/ubuntu

$ cd ros2_ws/
$ pwd

/home/ubuntu/ros2_ws

$ cd .
$ pwd

/home/ubuntu/ros2_ws

$ cd ..
$ pwd

/home/ubuntu

$ cd /
$ pwd

/

$ cd ~
$ pwd

/home/ubuntu

mkdir : 디렉터리 생성

make directories

$ mkdir test
$ ls

test

touch : 파일 생성

$ touch aaa.txt
$ ls

aaa.txt

mv : 파일 또는 디렉터리 이동

move

$ mv aaa.txt bbb.txt
$ ls

bbb.txt

cp : 파일 또는 디렉터리 복사

copy

$ cp bbb.txt aaa.txt
$ ls

aaa.txt bbb.txt

rm : 파일 또는 디렉터리 삭제

remove

  • rm -r : 폴더 삭제
  • rm -f : 강제 삭제 (주의)
$ rm bbb.txt
$ ls

aaa.txt

$ cd ..
$ ls

test

$ rm -r test
$ ls

cat : 파일 내용을 확인

catenate

$ cat ~/.bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac...

chmod : 파일 권한 변경

change mode

권한 읽는 법

1번째 자리 : 파일 종류

  • - : 일반 파일
  • d : 디렉토리

2~4번째 자리 : 사용자 권한

  • r : 읽기(4)
  • w : 쓰기(2)
  • x : 실행(1)

5~7번째 자리 : 그룹 권한

  • r : 읽기(4)
  • w : 쓰기(2)
  • x : 실행(1)

8~10번째 자리 : 그외 사용자 권한

  • r : 읽기(4)
  • w : 쓰기(2)
  • x : 실행(1)

ex) -rwxrwxrwx

파일 종류 : 일반 파일

사용자 : 읽기, 쓰기, 실행 가능 = 7(4+2+1)

그룹 : 읽기, 쓰기, 실행 가능 = 7(4+2+1)

그외 사용자 : 읽기, 쓰기, 실행 가능 = 7(4+2+1)

$ touch 123.txt
$ ls -al

total 8
drwxr-xr-x 2 ubuntu ubuntu 4096 Nov 27 11:16 .
drwxr-x--- 9 ubuntu ubuntu 4096 Nov 27 10:57 ..
-rw-r--r-- 1 ubuntu ubuntu 0 Nov 27 11:16 123.txt

$ chmod 777 123.txt
$ ls -al

total 8
drwxr-xr-x 2 ubuntu ubuntu 4096 Nov 27 11:16 .
drwxr-x--- 9 ubuntu ubuntu 4096 Nov 27 10:57 ..
-rwxrwxrwx 1 ubuntu ubuntu 0 Nov 27 11:16 123.txt

프로세스

ps : 현재 실행중인 프로세스 목록

process state

  • ps -e : 모든 프로세스 표시
  • ps -f : UID, PID 등을 포함해 full 포맷으로 표시
$ ps

PID TTY TIME CMD
394 pts/0 00:00:00 bash
1415 pts/0 00:00:00 ps

$ ps -e

PID TTY TIME CMD
1 ? 00:00:00 systemd
2 ? 00:00:00 init-systemd(Ub
7 ? 00:00:00 init
60 ? 00:00:00 systemd-journal
80 ? 00:00:00 systemd-udevd
90 ? 00:00:00 snapfuse
93 ? 00:00:00 snapfuse...

$ ps -f

UID PID PPID C STIME TTY TIME CMD
ubuntu 394 393 0 10:42 pts/0 00:00:00 -bash
ubuntu 1414 394 0 13:00 pts/0 00:00:00 ps -f

$ ps -ef

UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:42 ? 00:00:00 /sbin/init
root 2 1 0 10:42 ? 00:00:00 /init
root 7 2 0 10:42 ? 00:00:00 plan9 --control-socket 6 --log-level 4 --server-fd 7 --pipe-fd 9 --l
root 60 1 0 10:42 ? 00:00:00 /lib/systemd/systemd-journald
root 80 1 0 10:42 ? 00:00:00 /lib/systemd/systemd-udevd...

kill : 프로세스 종료

$ ps -ef

UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:42 ? 00:00:00 /sbin/init
root 2 1 0 10:42 ? 00:00:00 /init
...
ubuntu 1550 394 2 13:14 pts/0 00:00:00 /usr/bin/python3 /opt/ros/humble/bin/ros2 run demo_nodes_cpp talker
ubuntu 1551 1550 0 13:14 pts/0 00:00:00 /opt/ros/humble/lib/demo_nodes_cpp/talker
ubuntu 1561 1453 0 13:15 pts/2 00:00:00 ps -ef

$ kill 1551
$ ps -ef

UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:42 ? 00:00:00 /sbin/init
root 2 1 0 10:42 ? 00:00:00 /init
...
ubuntu 1561 1453 0 13:15 pts/2 00:00:00 ps -ef

텍스트 처리

vi / vim, nano : 편집기

  • vi / vim
    • I : 편집 모드
    • ESC : 명령 모드
    • w : 저장
    • q : 종료
    • ! : 강제 실행 (주의)
  • nano
    • Ctrl + S : 저장
    • Ctrl + X : 종료
$ vi 123.txt
$ nano 123.txt

셸 프로그램

echo : 문자열 화면에 표시

$ echo test

test

검색

grep : 패턴에 맞는 값 출력

$ pip list | grep setup
colcon-python-setup-py 0.2.9
setuptools 58.0.0

기타

clear : 터미널 화면 지우기

$ clear