명령줄 인터페이스(Command-Line Interface, CLI)
ex) 터미널로 하는 코딩 (모니터와 키보드만 사용하는 제어방식)
그래픽 사용자 인터페이스(Graphic User Interface)
ex) 윈도우즈 등 (마우스 사용하는 제어방식)
GUI는 사용자가 쉽게 컴퓨터를 제어할 수 있다는 장점이 있지만, 그래픽에 컴퓨터 자원을 많이 사용할 수밖에 없으며, CLI에 비해 느리다. 반면, CLI는 화면에 나타날 내용에 그래픽 작업을 거치지 않아도 되기 때문에 컴퓨터의 자원을 적게 사용하며, 더 빠르게 동작 하기 때문에 CLI를 잘 다룰 줄 알아야 한다.
학습목표
리눅스 터미널을 실행할 수 있다.
CLI를 이용한 작업과 GUI를 이용한 작업이 동일함을 이해할 수 있다.
리눅스 터미널에서 기본적인 명령어를 사용할 수 있다.
명령어를 사용할 때, 등장하는 키워드에 대해 이해할 수 있다.
절대 경로와 상대 경로의 차이를 이해할 수 있다.
터미널에서 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간을 프롬프트(Prompt)라고 함.
윈도우로 치면 아래 사진과 같은 폴더 탐색기 같은 기능이다.
CLI인 터미널에서는 간단하게 pwd를 프롬프트에 입력하고, Enter를 누르면 현재 경로가 나타난다.
pwd
명령어 mkdir은 생성할 폴더의 이름을 함께 입력해야 한다.
mkdir folderName
명령어 ls는 list의 약자로, 특정 폴더에 포함된 파일이나 하위 폴더의 리스트를 출력한다.
ls
명령어 ls에는 자주 사용하는 옵션 l과 a가 있다.
CLI에서 특정 명령어의 옵션을 사용하는 경우에는 -를 이용해 옵션을 입력한다.
ls -l
ls -a
ls -al 또는 ls -la
위의 세 번째 예시에서, 옵션을 뜻하는 대쉬(dash, -) 뒤에 오는 옵션의 순서는 기능에 영향을 미치지 않는다.
a는 "all"이라는 의미다. 숨어있는 폴더나 파일을 포함한 모든 항목을 터미널에 출력한다.
옵션 l은 폴더나 파일의 포맷을 전부 표현하라는 의미
ex)
drwxr-xr-x # 생략
-rw-r--r-- # 생략
위와 같이 출력되는데 d로 출력된 경우는 디렉토리를, -로 출력된 경우는 파일을 나타낸다. (나머지 rw등은 나중에~)
보통 위치 확인 -> 폴더 리스트 확인 -> 열고자 하는 폴더 진입 순서로 들어간다.
# pwd를 이용해 현재 위치를 확인합니다.
pwd
# [사용자명]은 처음 OS를 설치할 때 입력한 사용자 이름입니다.
# (Ubuntu) /home/[사용자명]
# (macOS) /Users/[사용자명]
# ls를 이용해 현재 위치의 모든 폴더와 파일을 확인합니다.
ls
# cd를 이용해 폴더 folderName로 진입합니다.
cd folderName
# pwd를 이용해 현재 위치를 확인합니다.
pwd
touch hi.txt
생성 명령어 파일이름.파일타입
txt = 텍스트(text)
ex) ls > ls.txt를 입력하면 ls.txt에 ls 명령어의 실행 결과가 저장 됨.
echo 유어클래스에_가입할_때_사용한_이메일 > hi.txt
echo는 echo 뒤의 내용을 화면에 출력해주는 역할을 한다.
cat hi.txt
명령어 cat을 이용하여 터미널에 출력하면, 파일의 모든 내용을 출력한다.
너무 큰 파일을 출력할 때 비효율적일 수 있고, 이때 cat 대신 사용할 수 있는 명령어들도 존재한다. 필요하면 구글링 ㄱㄱ
TIP. CLI를 통해 생성한 파일은 GUI로도 확인할 수 있으며, GUI로 파일을 수정하면 수정 사항을 CLI를 통해서도 확인할 수 있다.
폴더와 파일의 위치를 변경하거나 삭제하는 내용을 학습하기 위해 아래와 같이 입력해 파일을 조금 추가하도록 한다.
mkdir hello
cd hello # 폴더 hello로 진입합니다.
pwd # 현재 위치를 확인합니다.
mkdir bye
touch bye.txt
ls # 폴더와 파일을 출력합니다.
현재 위치는 하위 폴더 "hello"
명령어 rm은 폴더나 파일을 삭제할 때 사용
rm bye.txt
ls
# bye 폴더만 출력됩니다.
bye 폴더도 마저 삭제하자
rm bye
# rm: bye: is a directory
ls
# bye
삭제가 안된다.
명령어 rm은 단일 파일을 삭제할 수 있습니다. 만약 폴더를 삭제하려면 옵션을 이용해야 한다.
rm -rf bye
ls # 아무것도 출력되지 않습니다.
- 옵션 r은 "recursive"를 뜻하며, 옵션 f는 "force"를 뜻합니다. 지금은 어떤 뜻인지 명확하게 알지 못해도 괜찮다.
- 옵션 r은 폴더를 지울 때 사용하고, 옵션 f는 질문을 받지 않고 지울 때 사용한다.
- 앞으로 폴더나 파일을 삭제할 때 두 옵션을 같이 사용할 예정이다. 자세한 내용은 심화 학습 자료or 구글링에서 찾아보자.
mv는 move의 약자
연습을 위해 rm으로 삭제한 폴더 "bye"와 파일 "bye.txt"를 다시 생성
mkdir bye # bye 폴더를 생성합니다.
touch bye.txt # bye.txt 파일을 생성합니다.
명령어 mv를 통해 파일 "bye.txt"를 폴더 "bye"로 옮기자.
mv bye.txt bye/
ls
# bye 폴더만 출력된다.
명령어 mv 뒤에는 순서대로 [폴더나 파일의 이름][도착 폴더의 이름]를 입력한다.
bye 폴더 안으로 텍스트 파일이 옮겨진 것을 확인할 수 있었다.
명령어 mv를 이용하면, 폴더나 파일의 이름을 변경할 수 있다.
명령어 mv를 사용하기 위해 필요한 [폴더나 파일의 이름]에는, 변경할 폴더나 파일의 이름을 입력하고 [도착 폴더의 이름]을 대신해, 변경하고자 하는 파일의 이름을 입력한다.
폴더 "bye"에 있는 파일 "bye.txt"의 이름을 "helloWorld.txt"로 변경해보자.
ls # 현재 폴더에 있는 폴더나 파일을 출력합니다.
# bye.txt 파일이 출력됩니다.
mv bye.txt helloWorld.txt
ls
# helloWorld.txt 파일이 출력됩니다.
0과 1로 이뤄진 데이터 덩어리를 관리하는 컴퓨터는, 구조적 한계로 인해 내용물을 꺼내어 옮기는 개념이 없다.
따라서 파일을 복사해 원하는 위치에 붙혀넣고 원래 위치에 있는 파일을 삭제하는 방식으로 옮기게 된다. (삭제는 굳이 안하기도 함)
파일 복사 = cp [원본 파일 이름][복사할 파일 이름]
ls
# helloWorld.txt 가 출력됩니다.
cp helloWorld.txt hiComputer.txt
ls
# helloWorld.txt hiComputer.txt 가 출력됩니다.
이번에는 폴더를 복사해보자.
우선 상위폴더로 이동
cd ..
#명령어 cd를 이용해 상위 폴더 "hello"로 이동
ls
# bye가 출력됩니다.
pwd
# (Ubuntu) /home/[username]/helloWorld/hello
# (macOS) /home/[username]/helloWorld/hello
CLI에서 .은 현재 폴더를 나타낸다. ..은 현재 폴더(.)을 기준으로, 앞에 .이 하나 더 붙습니다. 이렇게 만들어진 ..은 현재 폴더보다 앞에 있는 폴더를 가리킵니다.
폴더 "bye"를 복사해 새로운 폴더 "hi"를 만들자
cp -rf bye hi
ls
# bye hi 가 출력됩니다.
각 명령어에 포함된 옵션은 명령어 이름만 입력하거나 -h 또는 --help와 같은 옵션을 통해 확인할 수 있다. or 구글링
관리자와 사용자의 차이점, 그리고 경로에 대해 알아보자.
윈도우(Windows)의 초기 버전에는 관리자 권한이 없었다.
정확히는 사용자가 없이, 항상 관리자 권한으로 프로그램을 설치, 변경, 삭제할 수 있었다.
PC가 항상 관리자 권한으로 실행되다 보니, 개발에 대한 지식이 없는 일반 사용자가 해킹당하는 일이 발생했었다.
이러한 해킹으로 부터 보호하기 위해 사용자를 추가하게 되었다.
경로는 명령어 pwd로 확인할 수 있는 절대 경로와, 현재 위치로부터 상대적인 위치를 나타내는 상대 경로로 나뉜다.
상대 경로는 특정 폴더 또는 파일의 위치를 현재 위치를 기준점으로 나타낸다.
현재 위치한 폴더는 점(.)으로 표현하고, 상위 폴더는 두 개의 점(..)으로 표현한다.
cd ./hi # 현재 폴더 아래의 hi 폴더로 진입하는 명령
pwd
# /home/[username]/helloWorld/hello/hi
ls
# helloWorld.txt hiComputer.txt
대부분의 CLI 명령어는 경로를 인식한다. 현재 폴더 아래에 있는 파일 helloWorld.txt를 폴더 helloWorld로 이동시켜 보겠다. 폴더나 파일을 이동하는 명령어는 mv다.
mv helloWorld.txt ../../
ls
# hiComputer.txt
cd ../../
pwd
# /home/[username]/helloWorld/
ls
# hello helloWorld.txt hi.txt
이어서 절대 경로의 시작점인 루트폴더(/)와 관리자에 대해 알아보자.
관리자 영역을 실수로 변경하면 운영체제(Operating System)가 먹통이 될 수 있으니 주의를 요한다.
whoami: 현재 로그인된 사용자를 확인하는 명령어
whoami
# [username]
사용자 폴더의 경로(Path)는 ~/로 표시된다. 물결 기호(~)는 루트폴더(/)로부터 사용자 폴더(username)까지의 경로를 축약한 형태다.
사용자가 새로운 프로그램을 설치하거나 변경 또는 삭제할 때에는, 관리자 권한이 필요하다. 사용자가 관리자 권한을 필요로 할 때, 관리자 권한을 이용할 수 있는 명령어 sudo를 알아보자.
명령어 sudo는 사용자 환경에서, 관리자 권한을 획득하는 명령어다.
명령어 sudo는 한시적으로나마 관리자 권한을 가지기 때문에 항상 비밀번호와 함께 사용한다.
mkdir justMkdir
sudo mkdir sudoMkdir
password: # 타이핑을 해도 출력이 없습니다. 비밀번호가 출력되지 않더라도, 입력이 정상적으로 이뤄지고 있습니다.
ls
# justMkdir sudoMkdir helloWorld.txt hi.txt
위와 같이 관리자 권한의 폴더를 만들 수 있다.
CLI에서 환경에서 유명한 에디터들이 많지만 nana에디터가 가장 사용하기 쉽다.
(vim의 아주 기본적인 사용법 )
터미널에서 아래의 명령어를 통해 nano를 실행시킬 수 있다.
nano hello.java # hello.java를 nano에서 엽니다.
nano # 그냥 실행할 수도 있습니다.
(A) 파일 이름 안내
(B) 파일 편집 화면, 실제로 여기서 텍스트 파일을 편집할 수 있습니다.
(C) 사용에 필요한 각종 단축키
nano 실행 후 ^R를 입력
터미널에서 "nano 파일이름"
파일 내용을 편집하고 난 후, 아래와 같이 ^X를 누르면 다음과 같은 프롬프트가 등장한다.
Save modified buffer (ANSWERIG "No" WILL DESTROY CHANGES) ?
아래의 단축키 안내에 따라 키보드의 Y 와 N을 눌러서 저장 여부를 결정할 수 있다.
nano를 종료하지 않고, 파일을 저장할 수도 있다.
단축키 모음에 Save가 안 보이지만, ^O WriteOut을 이용하면 된다.
패키지는 여러 파일이 담겨있는 하나의 상자다. 윈도우 운영체제에서 '알집'이나 '반디집'이란 프로그램으로, 여러 파일을 모아 하나의 파일로 만들 수 있다. 이렇게 여러 파일을 담고 있는 하나의 파일을 '압축 파일'이라고 한다.
패키지 안에 들어 있는 파일의 구성은 기본적으로 다음과 같다.
프로그램 파일
프로그램 설치 파일
프로그램 설치 설명서
프로그램에 대한 정보를 담은 파일
패키지 매니저는 패키지의 설치, 변경, 삭제 등 관리를 편리하게 해주는 도구다. (스마트폰으로 치면 앱 스토어 느낌)
터미널을 이용하여 패키지 매니저를 설치하고, 간단한 명령어를 통해 패키지 매니저를 사용하는 방법을 학습해보자.
Ubuntu 터미널에서 apt 입력
apt
apt 패키지 매니저의 주요 명령어를 알아보자.
패키지 목록 갱신: apt update(관리자 권한 필요)
업그레이드 가능한 패키지 목록을 출력: apt list -—upgradable
전체 패키지 업그레이드(버전 업): apt upgrade (관리자 권한 필요)
특정 패키지만 업그레이드(버전 업): apt --only-upgrade install 패키지 이름 (관리자 권한 필요)
패키지 설치: apt install 패키지 이름 (관리자 권한 필요)
설치된 패키지 보기: apt list --installed
패키지 검색: apt search 검색어
패키지 정보 확인: apt show 패키지 이름
패키지 삭제: apt remove 패키지 이름 (관리자 권한 필요)
패키지 설치/삭제 등의 작업을 진행할 때 sudo 명령어를 이용해서 관리자 권한을 획득해야 한다. (관리자가 아닌데, 설치 명령을 실행할 경우 에러 남)
예를 들어, wget이라는 패키지를 설치할 경우, 다음과 같이 입력해야 한다.
sudo apt install wget
암호를 물어본다. 암호 입력 후, 설치 가능
다음과 같이 중간중간 사용자 입력을 요구하는 경우가 있다. 터미널의 내용 역시 개발 중 디버깅할 때처럼 화면에 표시된 내용을 잘 읽는 것이 중요하다.
너무 시간이 오래 걸리거나, 뭔가 과정 중에 예상치 못하게 멈춰있는 경우에
Ctrl + C
#강제 종료
강제 종료 할 수 있다.
wget을 설치해 보세요. wget은 URL을 통해 파일을 다운로드하는 프로그램입니다.
복사: (Ubuntu) Ctrl + Shift + C
붙여넣기: (Ubuntu) Ctrl + Shift + V
wget -O goodjob.txt https://bit.ly/37sJqCo
neofetch설치 중 아래 에러가 계속 나왔다.
E: Unable to locate package neofetch
구글링 결과 sudo apt update를 하고 다시하니 정상적으로 완료 됐다.
폴더와 파일의 권한으로 폴더인지 파일인지 구분하는 방법과, 폴더나 파일의 사용 권한을 변경하는 방법을 학습해 보자.
임의의 폴더와 파일을 생성하고 비교하며 설명한다.
mkdir linux
nano hello.java
코드를 작성한 다음 Ctrl + X, Y, Enter 를 순서대로 입력하면, 새로운 파일을 저장할 수 있다.
터미널에 출력된 결과 중에서, 가장 왼쪽의 표현을 살펴보자.
폴더이면 d로, 파일이면 - 로 나타난다.
이어지는 r, w, x는 각각 read permission, write permission, execute permission으로 읽기 권한, 쓰기 권한, 실행 권한을 나타낸다. 3번에 걸쳐 나타나는 이유는 사용자와 그룹, 나머지에 대한 권한을 표시하기 때문이다.
따라서 파일 hello.java의 권한 rw-r--r--은 소유자는 읽기와 쓰기가 가능하고, 다른 사용자 그룹은 읽기만 가능하다는 의미가 된다.
더 linux의 권한은 rwxr-xr-x 으로, 소유자는 읽기와 쓰기, 실행이 가능하고, 다른 사용자 그룹은 읽기와 실행만 가능하다.
user:
user는 파일의 소유자다. 기본적으로 파일을 만든 사람이 소유자가 된다. 따라서 user를 소유자라고 하기도 한다.
group:
group에는 여러 user가 포함될 수 있다. 그룹에 속한 모든 user는 파일에 대한 동일한 group 액세스 권한을 갖는다. 많은 사람이 파일에 액세스해야 하는 프로젝트가 있다고 가정해보자. user에게 일일이 권한을 할당하는 대신에 모든 user를 group에 추가하고, 파일에 group 권한을 할당할 수 있다.
other:
파일에 대한 액세스 권한이 있는 다른 user다. 파일을 만들지 않은 다른 모든 user를 의미한다. 따라서 other 권한을 설정하면, 해당 권한을 global 권한 설정이라고 볼 수도 있다.
명령어 chmod로 폴더나 파일의 읽기, 쓰기, 실행 권한을 변경할 수 있다.
OS에 로그인한 사용자와, 폴더나 파일의 소유자가 같을 경우에 명령어 chmod 로 폴더나 파일의 권한을 변경할 수 있다.
만약 OS에 로그인한 사용자와, 폴더나 파일의 소유자가 다를 경우에는 관리자 권한을 획득하는 명령어 sudo 를 이용해 폴더나 파일의 권한을 변경할 수 있다.
명령어 chmod 로 권한을 변경하는 방식은 두 가지가 있다.
첫 번째는 더하기(+), 빼기(-), 할당(=)과 액세서(accessor) 유형을 표기해서 변경하는 Symbolic method다.
두 번째는 rwx를 3 bit로 해석하여, 숫자 3자리로 권한을 표기해서 변경하는 Absolute form다.
Symbolic method는 액세스 클래스, 연산자, 액세스 타입으로 구분함.
Access class | Operator | Access Type |
---|---|---|
u (user) | + (add access) | r (read) |
g (group) | - (remove access) | w (write) |
o (other) | = (set exact access | x (execute) |
a (all: u, g, o) |
명령어 chmod 뒤에 변경할 권한을 입력한다. 액세스 클래스의 u, g, o, a를 변경할 조건에 따라 조합하여 입력하고, 연산자와 액세스 타입을 순서대로 입력한다.
다음은 명령어 chmod 를 입력한 예시와 결과다.
chmod g-r filename # removes read permission from group
chmod g+r filename # adds read permission to group
chmod g-w filename # removes write permission from group
chmod g+w filename # adds write permission to group
chmod g-x filename # removes execute permission from group
chmod g+x filename # adds execute permission to group
chmod o-r filename # removes read permission from other
chmod o+r filename # adds read permission to other
chmod o-w filename # removes write permission from other
chmod o+w filename # adds write permission to other
chmod o-x filename # removes execute permission from other
chmod o+x filename # adds execute permission to other
chmod u+x filename # adds execute permission to user
chmod a=rw hello.java # -rw-rw-rw-
chmod u= hello.java # ----rw-rw-
chmod a+rx hello.java # -r-xrwxrwx
chmod go-wx hello.java # -r-xr--r--
chmod a= hello.java # ----------
chmod u+rwx hello.java # -rwx------
액세스 클래스와 연산자, 액세스 타입을 모두 기억해야만 Symbolic method를 이용해 권한을 변경할 수 있다.
Absolute form은 숫자 7까지 나타내는 3 bits의 합으로 표기한다.
사용자, 그룹, 또는 다른 사용자나 그룹마다 rwx 가 나타나고, 각 영역의 boolean 값으로 표기할 수 있다.
Permission | Number |
---|---|
Read (r) | 4 |
Write (w) | 2 |
Execute (x) | 1 |
만약, user는 rwx 를, group과 other은 r-- 로 권한을 변경하려고 한다면, 위 표에 나와있는 숫자의 합을 user, group, other 순으로 입력하여 사용한다.
# u=rwx (4 + 2 + 1 = 7), go=r (4 + 0 + 0 = 4)
chmod 744 hello.java # -rwxr--r--
Absolute form에서 사용하는 숫자는 다음의 표를 참고
# | Sum | rwx | Permission |
---|---|---|---|
7 | 4(r) + 2(w) + 1(x) | rwx | read, write, execute |
6 | 4(r) + 2(w) + 0(-) | rw- | read, write |
5 | 4(r) + 0(-) + 1(x) | r-x | read and execute |
4 | 4(r) + 0(-) + 0(-) | r— | read only |
3 | 0(-) + 2(w) + 1(x) | -wx | write, execute |
2 | 0(-) + 2(w) + 0(-) | -w- | write only |
1 | 0(-) + 0(-) + 1(x) | —x | execute only |
0 | 0(-) + 0(-) + 0(-) | —- | none |
파일 권한과 관련된 레퍼런스를 통해 추가적인 학습을 진행해봐도 좋다.
PC에 환경변수를 왜 사용하는지, 그리고 어떻게 사용할 수 있는지에 대해 학습을 진행하겠다.
환경변수는 프로그램의 동작에 영향을 미치는 값들을 의미한다.
ex) A프로그램을 동작시키는데 B프로그램의 데이터가 필요한 경우
Windows에서는 환경변수를 영구적으로만 설정할 수 있다. 즉, 한 번 설정해두면 사용자가 삭제하지 않는 이상 환경변수가 사라지지 않는다.
확인을 누르면 변경사항이 적용된다. (확인을 누르지 않으면 변경 사항이 저장이 되지 않음)
cmd를 검색하여 연 다음, set 명령어를 입력하여 환경변수가 제대로 설정되었는지 확인한다.
r은 recursive의 약자로 특정 행동을 순환적으로 반복한다.
f는 force의 약자로 어떤 행위를 강제한다.
ex) 파일A가 들어있는 폴더A가 있다고 하자.
rm 명령어를 통해 폴더A를 삭제하고자 하면 오류가 추력되며 삭제가 안된다. 이때 -r 옵션을 추가하면 파일을 저장하고 있는 폴더도 삭제가 가능하다.
rm - f 명령어를 사용하면 보호되거나 존재하지 않는 파일도 강제로 삭제할 수 있다. 그런 이유로 f 명령어를 사용하실 때는 각별히 주의해야 한다.
r과 f 명령어를 합쳐 rf 형태로 쓸 수 있다. rm -rf 명령어를 사용하면 민감한 정보를 가진 파일도 무차별적으로 삭제하여 심각한 문제를 일으키는 경우가 생긴다. 따라서 위와 마찬가지로 주의해야한다. (관련 내용을 설명하고 있는 레퍼런스 가장 아랫부분을 참고하라)
rm 명령어 뿐만 아니라 cp와 같은 다른 명령어에도 f 옵션과 r 옵션을 적용할 수 있다.
cat 명령어를 이용하면 터미널에서 파일 안에 담긴 내용을 확인할 수 있다. 그러나 항상 전체 내용을 출력하기 때문에 생기는 단점들이 있다.
(양이 너무 낳아서 내용이 잘려서 나오거나 정보를 찾기 위해 시간이 오래 걸리는 등)
전체를 열람하지 않고 파일 내용의 부분만 열람할 수 있게 만들어주는 명령어 레퍼런스를 첨부한다.
터미널에서 '도움말' 역할을 하는 명령어 옵션이 있다. 아래 레퍼런스에서 자세하게 소개되어 있다.