본문 바로가기
오픈소스SW

CLI (Command Line Interface) 기본

by sepang 2021. 7. 30.

저번학기에 과제를 하면서 리눅스라는 걸 처음으로 접해봤다. 생각없이 우분투를 다운받아서 열어보니 cmd창이랑 비슷하게 생겨서 당황했었다. 운영체제라고 하길래 Windows나 Mac처럼 바탕화면이 처음으로 보일 줄 알았는데 그냥 검은색 콘솔창이 전부였다. 거기다 무슨 cd, ls, ... 등의 커맨드로 폴더나 파일에 접근하길래 익숙치 않고 불편해서 굉장히 곤혹을 느꼇다. VS code에 대해 알게되서 조금 편해지긴 했는데 커맨드 라인 사용에 익숙해지면 이후에 도움이 된다길래 기본적인 사용법을 찾아보았다.

근데 막상 기본 사용법은 정말 별게 없었다. 익숙치 않은 검은화면에 내가 지레 겁을 먹었던 것 같다😥. 생각해보니 크게 어렵진 않았던 CLI에 대해 간단히 정리해보고자 한다. 폴더와 파일의 CRUD(Create, Read, Update, Delete)를 기준으로하고 사용중인 노트북이 os가 윈도우인 관계로 git bash를 사용했다.

GUI와 CLI


Windows (GUI)
Linux (CLI)

GUI(Graphic User Interface) 는 Windows나 Mac을 생각해보자. 파일을 선택할 때 마우스를 클릭하고 폴더에 접근할 때는 해당 폴더를 더블클릭한다. 이런 것 처럼 아이콘이나 그래픽 등을 이용하여 컴퓨터와 사용자가 상호작용을 하게된다. 반면에 CLI(Command Line Interface) 는 command를 통해 컴퓨터와 상호작용하게 된다. 때문에 마우스를 쓸 필요가 없다. 아니 쓸 수가 없다. 내가 컴퓨터에 명령을 내리면 컴퓨터가 해당 명령을 처리하게 되는 것이다. GUI와 다르게 직관적이지 않아서 나처럼 GUI만 사용해오던 이들에게는 많이 낯설 수 있겠다. 본인은 아직까지도 익숙하지 않다..ㅠㅠ

기본 사용법


폴더

우선 폴더의 CRUD를 알아보자

pwd(print working directory)

현재 위치해 있는 폴더를 출력한다. 여기서 출력되는 위치를 기준으로 다른 삭제나 이동 커맨드가 작동한다.

/

root directory를 의미한다. 파일 시스템에서 가장 최상위 폴더이다.

~

home directory를 의마한다. 리눅스와 윈도우에서 차이점이 있는지는 모르겠지만 윈도우 기준으로 계정명을 이름으로 갖는 폴더(ex. c/Users/name)를 가리킨다.

cd(change directory)

현재 위치를 이동한다. 예를 들어 'cd /' 라고 입력하면 현재 위치가 root directory로 변경된다.

mkdir(make directory)

현재 위치한 폴더 내에 새로운 폴더를 생성한다. 'mkdir (폴더명)'을 입력하면 해당 폴더명을 가지는 폴더가 생성된다.

rm -r(remove recursively)

'rm'은 삭제하라는 명령어인데 파일과 다르게 폴더 삭제를 위해서는 -r이라는 옵션을 붙여줘야 한다. 폴더를 삭제하는게 파일을 삭제하는 것보다 잘못했을 경우 훨씬 위험해서 그렇다는 것 같다.

※절대경로 & 상대경로

어떤 폴더를 지칭할 때 해당 폴더의 위치를 표현하는 2가지 방법이 있는데 절대경로상대경로이다. 만약 cd를 이용하여 현재 위치를 이동한다고 했을 때, 절대경로를 이용하면 현재 나의 위치가 어디라도 동일한 위치로 이동된다. 하지만 상대경로는 현재 위치를 기준으로 하기 때문에 같은 커맨드를 입력해도 이동되는 경로가 다를 수 있다. './' 는 현재 위치한 폴더, '../' 는 상위폴더를 의미한다. 만약 내가 'parent'라는 폴더내의 'child1', 'child2'라는 폴더 중 'child1'이라는 폴더에 위치해 있을 때 상대경로를 이용하여 'child2'폴더로 이동하려면 'cd ../child2' 를 입력하면 된다. 참고로 파일이나 폴더명을 그냥 입력하는 경우에는 자동으로 앞에 './'가 붙여져서 현재 디렉토리에 있는 파일이나 폴더를 가리킨다.

mv(move), cp(copy)

해당 커맨드는 좀 특이하다. 기본적으로는 이름처럼 파일을 이동시키는 커맨드이다. 'mv (폴더명, 파일명) (경로)' 를 입력하면 해당 경로로 폴더나 파일이 이동된다. 그런데 'mv (폴더명, 파일명) (폴더명, 파일명)' 를 입력하면 뒤에 적은 이름으로 이름이 변경된다. 두번째 이름을 첫번째 이름에 뒤집어쓴다고 생각하자. mv를 'cp' 로 바꿔주면 이동이 아닌 복사가 된다.

파일

ls(list)

현재 위치한 폴더 내부의 폴더, 파일을 표시한다. -l, -a 등 옵션을 덧붙이면 추가적인 정보가 출력된다. 예를 들어 'ls -l' 를 입력하면 최근 변경 시간등의 추가적인 정보도 출력이 된다.

rm(remove)

'rm (파일명)' 을 입력하면 해당 파일이 삭제된다. ls와 동일하게 옵션을 추가할 수 있으니 참고하자.

touch

'touch (파일명)' 을 입력하면 현재 폴더에 빈 파일이 생성된다.

nano

여러가지 텍스트 에디터들이 존재하는데 nano는 그 중 하나다. 'nano (파일명)' 으로 실행하여 파일을 편집할 수 있다.

그 외

;(명령 분리)

'hello.txt'라는 파일을 부모 디렉터리로 이동시킨 후 'hello2.txt'로 파일명을 바꾼뒤 현재 디렉토리에 있는 폴더, 파일을 출력하려고 하면 'mv hello.txt ../', 'cd ../', 'mv hello.txt hello2.txt', 'ls'를 차례대로 입력해야 한다. 일일히 하나의 명령 입력 후 엔터키를 쳐줘야 하는데, ';' 로 명령을 구분하여 한 줄에 여러 명령을 내릴 수 있다. 방금 같은 작업은 'mv hello.txt ../;cd ../;mv hello.txt hello2.txt;ls'로 처리할 수 있는 것이다. 지금이야 간단한 작업이라지만 많은 시간이 소요되는 작업들을 실행할 때는 해당 커맨드의 중요성이 드러날 것이다.

하지만 중간에 파일명이나 폴더명을 잘못 입력할 수 있다. 오류가 발생할 수도 있으므로 이런 점이 우려될 때는 ';'대신 '&&' 를 사용하면된다. 앞선 작업에서 오류가 발생하면 뒤의 작업은 수행하지 않게 된다.

그런데 '&&'는 어디서 많이 본 것 같다. 여러 프로그래밍 언어에서 AND 조건문에 해당 '&&'연산자가 사용된다. 사실 조건 A, B가 있을 때, 'A && B' A가 false라면 뒤의 조건문은 계산하지 않는다. 위의 커맨드 라인의 '&&'와 매우 유사하다. 반대로 'A || B'인 경우 A가 true라면 뒤의 B는 굳이 계산하지 않는다.(그렇지 않은 언어가 있을 수도 있다...). 뭔가 신기하지 않나? 본인은 이걸 알았을 때 이런 연결점?이 있다는게 되게 신기하게 다가왔다.

댓글