리눅스 명령어 시작하기 – 리눅스 기초 3

리눅스 명령어 시작

GUI의 문제점

많은 사람들이 사용하는 윈도우에는 GUI(그래픽 유저 인터페이스)를 사용하는 것을 당연하게 생각합니다. 하지만 GUI는 원래는 CLI(명령어 라인 인터페이스)에서 처리했던 작업들을 좀더 사용자 친화적으로 변경한 것 뿐입니다. 지금도 있겠지만 컴퓨터라는 자체를 처음 배우는 사람들을 위한 컴퓨터 초보 교실에서 가르치는 것을 보면 대부분 이렇게 설명하지요. 예를 들면 ‘왼쪽 아래에 있는 윈도우 모양의 아이콘을 클릭하시고 메뉴가 나오면 검색창에서 ‘탐색기’라고 입력하세요~’ 라는 식입니다. 언뜻 보면 매우 쉽게 설명하는 것 같지만 입력이라는 입장에서 보면 상당히 복잡한 과정을 거치고 있는 것 입니다.

리눅스와는 많이 다르지만 윈도우에도 cmd라는 터미널이 있습니다. 같은 작업을 윈도우 터미널에서는 explorer 라고 입력하고 엔터키를 누르면 바로 접근이 가능합니다. 윈도우 전체의 화면을 보고 마우스를 옮기고 클릭을 한 후에 다시 검색창을 클릭하고 그 안에 검색어를 입력하고 찾아서 다시 마우스를 클릭합니다. 단계만 비교해봐도 터미널에서는 explorer 라는 단어만 알고 있으면 되는데 윈도우에서는 데스크탑의 메뉴 -> 내부 검색 창 -> 검색 후 선택하는 과정까지 3단계를 거치고 입력도 마우스에서 키보드 다시 마우스로 세번이나 바뀝니다. 물론 바탕화면에 바로가기 같은 편리한 기능이 있다고 말할 수도 있습니다만, 바로가기를 하나씩 추가하다 보면 어느새 바탕화면이 수십개도 넘는 아이콘으로 복잡하게 변하는 것을 볼 수 있습니다.

윈도우를 많이 사용하면서 명령어 입력이 어렵다고 생각하는 시대가 되었지만 윈도우가 범용 PC가 되면서 점점 GUI가 CLI 보다 이해하기 어렵고 복잡해지는 일도 생겼습니다. 특히 일반 사용자보다 윈도우 PC의 관리자(데스크탑과 서버 관리자)들은 GUI로 관리하는데 한계가 있는데요. 관리에 관한 일을 처리하기 위해서 파워셸(Powershell)이라는 명령어셸을 사용합니다.

그렇다면 명령어 방식은 관리자들에게만 좋은 것인가? 그렇지는 않습니다. 마이크로소프트사도 윈도우 이전에 MS-DOS 시절에는 명령어 인터페이스를 사용했습니다. 일반 PC유저들도 잘 사용했습니다. 그 때 불편한 부분들이 있었다면 그때는 지금과 다르게 인터넷도 잘 발달하지 않았었고 각종 유틸리티나 패키지 관리(응용 프로그램 관리자) 프로그램들이 지금보다 좋지 않았습니다. 만약에 그 때 지금처럼 패키지 관리자가 잘 되어 있었다면 처음부터 윈도우 GUI를 사용하지 않았을 사람들이 많았을 겁니다. 유닉스를 인증받은 맥OS를 사용하는 많은 사람들이 다시 윈도우로 돌아가지 않는 것을 보면 굳이 윈도우 GUI가 필요없지 않았나 생각도 듭니다. 아니 필요는 하겠지만 그렇게 오랜 시간 시장을 지배한 것이 오픈소스 커뮤니티의 발전에는 큰 도움이 되지 않았던 것 같습니다. (적어도 많은 이들이 그렇게 생각하고 있는 듯 합니다)

위에서 명령어 라인의 장점을 짧은 입력 과정으로 설명했는데 진정한 장점은 Bash라고 하는 리눅스의 SHELL에 있습니다. Shell 은 그 자체가 스크립트 인터프리터이자 프로그래밍 언어입니다. 언어적으로 따지면 동적타이핑(dynamic typing) 방식의 스크립트 언어라고 할 수 있겠는데요. C계열이나 자바와 다르게 쉽습니다. 학습 초기 단계의 진입장벽이 낮지요. 즉 타이핑을 할 수 있다면 누구나 할 수 있습니다. 리눅스에 관한 책들을 읽다 보면 어떤 강사는 할머니도 리눅스를 배울 수 있을 정도로 쉽다고 말합니다.

흔히 명령어 라인을 잘못 입력하면 컴퓨터가 망가지는 경우도 있을 것 같은데 리눅스에서는 root나 관리자 권한이 없으면 절대로 시스템에 손상을 가할 수 없습니다. 권한 개념은 있지만 대부분 파일 시스템의 권한이 부실하게 열려 있는 윈도우는 그렇지 않습니다. 윈도우 운영체제도 후대에 와서는 보안이나 권한 관리에 많은 신경을 쓰기 시작했지만 처음부터 다중 사용자를 고려하고 만든 유닉스 계열과 비교는 어렵습니다.

이런 내용을 굳이 꺼내는 이유는 명령어 사용에 대해 단순히 어렵다거나 오래된 방식이라는 일종의 편견같은게 있는 시대를 살고 있기 때문입니다. 명령어 스크립트로 작성한 파일 하나로 해결할 수 있는 일을 사람이 GUI에서 작업하려면 몇 시간이 걸리는 일도 허다합니다. 요새는 회사들이 전부 효율성을 따지기 때문에 업무 자동화가 중요한 화두입니다만, 그 업무 자동화 기능이 리눅스에서는 처음부터 탑재되어 있었습니다.

파이썬의 인기에 힘입어 어느 날 갑자기 업무자동화가 도입된 것 처럼 느껴지는데 그건 처음부터 있었습니다. 일반 회사나 가정에서 PC를 사용하며 명령어를 타이핑하는게 어렵다면 어려운 일일 것 같고 또 대중적으로 인기를 끌만한 것은 아닌 것 같기도 합니다.

리눅스 명령어 장점

1. 리눅스 명령어 사용은 생각보다 어렵지 않다. 무의미하게 마우스를 움직이지 않아도 되서 혼동이 없다 2. 많은 경우 GUI보다 훨씬 빠르고 쉬워서 낡은 방식도 아니다. 3. 스크립팅은 자동화의 시작이다.

이 정도로 정리할 수 있겠습니다.

물론 SHELL을 사용하는 것은 단순히 명령어 하나를 입력하는 차원이 아닙니다. 리눅스 시스템을 전반적으로 이해하지 않으면 GUI보다 더 답답하게 느껴질 것 입니다. 다만 확실한 것은 명령어 방식은 오래 사용할 수록 시스템을 이해할 수 있는 방식이고 GUI는 점점 더 시스템을 이해하기 어렵게 합니다. 모든 사람이 프로그래머가 될 필요는 없기에 어떤 방식이 옮다고 단정할 수는 없습니다. 다만 적어도 시스템을 다루는 직업이라면 명령어가 필요한 경우가 생길 수 있으니 기초적인 부분은 배우는 것을 권장합니다.

리눅스 셸의 기초는 Bash (Bourn Again Shell) 입니다. 최신 버전 맥OS에서는 zsh을 기본 터미널로 설치하는데 Bash 에 기반하기 때문에 맥북을 사용할 때도 도움이 됩니다.

리눅스 명령어 시작하기

리눅스 셸(Shell)이란?

Shell의 사전적 의미는 조개의 껍데기라는 뜻입니다. 한국어 발음으로는 셸이나 쉘이나 그렇게 부르는 것 같은데 영어적인 발음은 슈이엘(SH-ELL)에 가까워서 한글로 수엘인 쉘보다는 셸이라고 하겠습니다. 웬지 쉘이라고 하면 셀쪽에 가까운 느낌이 들어서 저는 셸이라고 많이 하는데 표기로는 쉘도 많이 씁니다.

셸은 사전적 의미처럼 감싸고 있는 단단한 껍데기입니다. 뭐를 감싸고 있느냐? 리눅스의 심장인 커널(Kernel)을 감싸고 있습니다. 커널은 운영체제의 핵심으로 하드웨어의 리소스에 직접 접근할 수 있습니다. 하드웨어 리소스라는 것은 CPU, 메모리, 저장장치, I/O(입력장치과 출력장치) 등 PC에 달려있는 온갖 장치들입니다. 그것들을 제어하는 프로그램이 커널이라고 할 수 있는데 커널을 System Call을 사용하여 날 것 그대로 프로그래밍 할 수도 있지만 셸이 있기 때문에 그럴 필요가 없습니다. 예를 들어서 텍스트 파일을 만들고 싶다면 touch (파일이름)을 입력하면 바로 파일이 만들어집니다. 이 안에 텍스트를 저장하고 싶다면 vim (파일이름)을 입력해서 파일을 편집하고 저장하면 됩니다.

명령어의 형식은 정해져 있습니다. 명령어(Command) -옵션(option) 인수 (argument, 매개변수라고도 함 -parameter) 입니다.

예를 들어서 ls는 현재 디렉토리의 파일과 디렉토리를 출력하는 명령어입니다. 여기에 ls -a 라고 하면 숨겨진 파일까지 모두 출력하게 합니다. 또 ls -l 이라고 주면 길게 출력합니다.

리눅스 명령어 ls
리눅스 명령어 ls

명령어 따라 ls -la 처럼 옵션을 두 개 이상 사용하는 것도 가능합니다. 사용하다 보면 익숙해지겠지만 parameter 에는 short – 방식과 long — 방식이 있습니다. – 이것이 하나들어가면 옵션을 하나의 문자로 표현합니다. ls -a 이나 ls -l 처럼 하나의 문자가 옵션 하나를 뜻 합니다. long 방식은 — 두개 이상의 문자로 표현한 옵션을 말합니다. 예를 들어 –version 같은 것 입니다. version 이 하나의 매개변수입니다.

C프로그램을 생각하면 argument 를 여러개 받아서 어떤 형식으로간에 프로그래밍 할 수 있습니다. 리눅스는 C언어로 쓰여졌기 때문에 main 함수가 받는 argument가 이 옵션들이지요. 다만 각각 프로그래머 마음대로 옵션을 설정하는 것은 혼동스럽기 때문에 GNU/Linux에서는 어느 정도의 공통적인 기준이라는 것은 있습니다. 예를 들어서 –version 이나 –help는 대부분 프로그램에서 비슷한 의미를 갖습니다. 초기에는 이런 것들이 혼동스러운데 사용을 계속 할 수록 적응이 될 겁니다.

그러면 이제 본격적으로 리눅스 명령어를 알아보겠습니다.

기초 명령어

리눅스 명령어는 100개도 넘어가는 것으로 알려져 있습니다. 100개면 어떻게 해서 든 외울 수 있을 것 같긴한데 문제는 옵션입니다. 하나의 명령어에 달려있는 옵션을 조합하면 그 가지 수가 엄청 늘어나기 때문에 처음부터 단순 암기법으로 접근하는 것은 좋지 않습니다. 자신의 업무나 사용 방법에 따라 자주 사용하는 명령어는 어느 정도 나오게 됩니다.

구글을 검색하면 당신이 알아야 할 리눅스 명령어 20개 이렇게 참 많이 나오는데 그런 문서들도 참고하면 도움이 됩니다. 이 포스팅에서도 100개가 넘는 모든 리눅스 명령어에 대해서 설명하지 않을 겁니다. 또 엄청나게 많은 옵션을 전부 다루지는 않을 겁니다. 100개를 다 안다고 하더라도 제대로 활용하지 못하면 소용이 없습니다.

처음에 시작할 때 알아둬야 할 몇 개 정도만 챙기고 필요할 때 인터넷에서 레퍼런스를 참고하도록 합니다. 또 리눅스에는 명령어에 대한 메뉴얼을 제공하는 man 명령어가 따로 있습니다.

pwd

pwd는 print working directory 입니다. 현재의 유저가 위치한 곳 입니다. 리눅스 시스템에 로그인 하면 보통은 사용자의 home에서 시작합니다. 사용자의 home으로 돌아가는 명령어는 cd 입니다. cd를 입력하고 pwd를 입력하면 아마 /home/사용자 의 결과를 볼 수 있을 것 입니다.

$ pwd

[실행결과]

/디렉토리

현재 자신이 어디에 위치해 있는지 모를 때 사용합니다. 어디인가 너무 깊숙히 들어와 있다면 cd 명령어로 home 에 돌아오는 것도 방법입니다.

date

date 명령어는 현재 날짜와 시간을 표시합니다. 형식은 locale 의 설정에 따라 달라집니다.

$ date

[실행결과]
2021. 11. 22. (월) 12:42:23 KST

cal

cal 명령어는 텍스트로 된 달력을 표시합니다.

$cal

[실행결과]

      11월 2021
일 월 화 수 목 금 토
    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

ps

ps 명령어는 현재 실행중인 프로세스 정보를 볼 수 있습니다. -f 옵션으로 full information (모든 정보)를 볼 수 있습니다.

$ps

[실행결과]

  PID TTY          TIME CMD
    9 pts/0    00:00:00 bash
   19 pts/0    00:00:00 dbus-launch
   81 pts/0    00:00:00 bash
  110 pts/0    00:00:00 bash
  161 pts/0    00:00:00 ps

touch

파일을 터치한다~ 는 개념이 있습니다. 텍스트 파일을 만들기 위한 용도로 많이 사용합니다. 한편 파일이나 디렉토리에 접근한 시간을 변경해주는 명령어입니다. 파일의 메타 데이터에는 최종적으로 파일에 접근한 시각이 저장됩니다. 접근한 내용의 확인은 ls -l 로 확인하거나 stat (파일이름) 으로 확인하도록 합니다. (시간을 확인)

$touch (파일이름)

echo

echo 명령어는 텍스트를 출력하는데 사용합니다. 스크립트 프로그래밍 할 때 유용한데 파이썬의 print 함수와 비슷하게 사용할 수 있습니다. 운영체제의 print 역할을 하는데 시스템 환경 변수 등을 출력하는데도 사용합니다. 셸에서는 var=10 처럼 변수를 즉석에서 만들 수도 있는데 echo $var 처럼 변수를 출력할 때는 $ 달러 사인을 사용합니다. Bash 스크립트를 만들 때 거의 많이 쓰게 됩니다.

$echo hello world!

[실행결과]
hello world!

cd

cd는 change directory 의 약자입니다. cd 만 입력하면 자신의 홈 디렉터리로 돌아옵니다. 기본 사용법은 cd /etc/ 처럼 디렉토리의 절대 경로를 치면 되는데, 상대적 사용법도 많이 사용합니다. cd 디렉토리 – 현재 디렉토리의 하위 디렉토리로 들어갑니다. cd .. 한칸 상위 디렉토리로 갑니다. cd는 pwd 와 함께 사용해서 현재 위치가 어디에 있는지 확인하도록 합니다. bash 셸의 기본 설정된 프롬프트에는 현재 디렉토리의 위치가 나타납니다. (프롬프트 설정도 바꿀 수 있다)

$cd

su

su는 switch user 입니다. su 이라고 하면 super user 슈퍼 유저인 루트로 변경하는 것 이며 패스워드가 걸려 있습니다. 우분투를 설치하면 최초에 admin 사용자 등록을 하는데 root 유저는 별도로 su -l 로 등록을 해줘야 사용이 가능합니다. 최초 한번 등록하면 다음부터 su 로 root 유저로 변경할 수 있습니다. root 유저로 변경하는 이유는 시스템의 전 권한을 사용하기 위해서 입니다. ubuntu에 뭘 설치할 때 sudo 라는 단어가 나옵니다. 이것은 super user 의 권한으로 설치하라는 뜻 입니다. 이러한 권한은 당연히 admin 레벨이나 최고의 유저인 root 가 가지고 있기 때문입니다.

$su

[실행결과]

root로 변경한다.

$su -l

[실행결과]

root 로 변경한다. 
최초 실행시 root 패스워드 등록한 후에 사용가능하다 

mkdir

mkdir 은 make directory 입니다. 디렉토리를 바로 만들어 줍니다. 스크립트로 디렉토리를 만들면 상당히 빠르게 원하는 수만큼 디렉토리를 만들 수 있습니다.

$mkdir (디렉토리명)

[실행결과]

새로운 디렉토리를 만든다

rm

rm 은 remove 로 파일이나 디렉토리를 삭제합니다. 파일은 rm으로 삭제 가능하지만 디렉토리는 rm -r 옵션을 줘야 삭제가 가능합니다. 그 밖에 삭제에 관한 다양한 옵션이 있습니다.

$rm (파일명)

[실행결과]
파일을 삭제한다

$rm -r (디렉토리명)

[실행결과]
디렉토리를 삭제한다

cat

cat 은 concatenate 의 약자로 합치다, 연결하다의 뜻이 있습니다. C언어의 concatenate 함수는 문자열을 합치는 기능이 있는데 bash의 cat은 출력, 합치기, redirection 의 방식을 사용합니다.

touch (파일이름) 으로 텍스트 파일을 하나 만들고 vim 편집기로 텍스트를 몇 줄 넣고 저장합니다. 그런 다음에 cat을 사용합니다.

$cat mytext

[실행결과]
this is text 1.
text1 line 2.

연산자 > 를 사용하면 새로운 파일을 만들고 그 문자열을 그대로 저장합니다. >> 를 두번 사용하면 기존 파일내용에 추가를 합니다. > 를 사용하면 기존 파일이 있는 경우 덮어쓰기합니다.

$cat mytext > newtext

-> mytext 를 newtext 로 복사한다(새로운 파일)

cat mytext >> newtext

-> mytext 를 newtext 에 추가한다

cat mytext mytext2 > newtext2

-> 두개의 파일을 이어서 하나의 파일 newtext2 를 생성한다

마무리

리눅스에서 기초가 되는 커맨드를 알아봤습니다. 물론 이것들이 전부는 아닙니다. 하지만 단순 암기 방식으로 오늘은 커맨드 20개 외운다 내일은 30개 외운다 이렇게 학습하는 방식은 별로 권장하지 않는데요. 대학교나 자격증 시험볼 때는 그 방식이 통할지는 모르겠지만 그런 식으로 공부하는 큰 의미는 없습니다. 새로운 주제를 공부할 때 필요에 의하여 하나씩 하나씩 습득하는게 좋습니다.

프로그램에 관련한 일을 하거나 혹은 PC를 관리자 급으로 사용한다면 운영체제는 아마 평생 사용해야 할 것이고 리눅스 셸은 이미 충분히 성숙한 운영체제로 크게 바뀔 일도 없을 겁니다. 리눅스는 매우 안정적인 운영체제입니다. 사실 검증된 프로그램만 돌리면 365일 동안 켜놓은 상태로도 돌아갑니다. 중요한 업데이트를 하지 않는 이상 리부팅할 일도 별로 없지요. 기업에서 리눅스를 사용하는 이유가 있습니다.

셸스크립트 프로그래밍에서 GNU 툴들과 함께 다양한 명령어를 조합해서 사용하게 됩니다. 다른 프로그래밍 언어도 그렇지만 모든 명령어, 함수 등을 기억할 필요는 없습니다. (한 때는 그게 필요한 시대도 있었지만) 하지만 어떻게 사용하는지 이 명령어는 어떤 옵션과 매개변수가 필요한지 정도는 알고 있어야 합니다. C의 라이브러리 함수를 사용하는 것과도 비슷한 점이 있습니다. 함수를 사용하려면 함수의 이름과 매개변수, 리턴값과 같은 기본적인 내용을 알고 있어야 합니다. 함수에 비하면 셸은 훨씬 더 사용자 친화적입니다. 기본적인 내용을 숙지하면 익숙해지는데 그렇게 오래 걸리지 않을 겁니다.

외부참고

The Linux command line for beginners | Ubuntu

Leave a Comment