======Linux 명령어 기초=====
{{youtube>AKLm3Z9ELEA?medium}}
=====1. Linux 구조=====
====1.1. 저장소 구조====
리눅스에서 파일을 저장하고 다루는 방식은 일반적인 컴퓨터 환경인 Windows에서와 크게 다르다.\\
다만 Windows에서는 불가능하거나 활용하기 어려운 많은 기능들을 더 쉽게 살려낼 수 있어\\
더욱 강력한 파일 활용이 가능하다.
===1.1.1. Windows와 비교===
모든 파일들이 C 드라이브 아니면 D 드라이브 내에 저장되는 윈도우와 달리,\\
리눅스에는 C 드라이브, D 드라이브 등이 **아예 없다**.
파일이 저장되는 장소부터 완전히 다르다.\\
{{https://thesagediary.files.wordpress.com/2018/09/linuxfile.png?900}}\\
**모든** 파일은 ''/'' 바로 이 슬래쉬라는 장소 아래에 저장된다.\\
이 슬래쉬는 ''root''라고 부른다. (말그대로 "근본"이다.)\\
\\
하지만 여기에 저장된 파일들이 사실 **모두 정상적인 파일은 아니다**.\\
===1.1.2. 파일 권한===
윈도우는 **파일**이라고 하면 워드 파일, 파워포인트 파일 등 진짜 데이터가 담긴 파일들 뿐이지만\\
리눅스에서는 정말 데이터가 담긴 파일이 아닌 것들도 파일로 취급한다.\\
(이상 자세한 설명은 리눅스 시스템의 깊은 곳으로 들어가므로 생략한다)\\
또한 이렇게 모든 파일들이 ''루트'' 한 곳 아래 몰려 있는데\\
한 컴퓨터에서 여러 사람이 동시에 사용할 수 있게 하려다 보니\\
파일 각각에 누가 만들었는지, 누가 어떻게 사용 가능한지를 기록하게 되었다.\\
이것이 **파일 권한**이다.
{{https://img.kasimov.synology.me/reference/linux/basic-commands/ll.jpg?500|}}\\
위 사진은 파일 목록을 확인한 것이다.\\
목록 맨 앞줄 ''drwxrwxrwx'', 그 뒤 ''root root''가 여기에 해당하는 것이다.
^ 알파벳 ^ 권한 ^ 값 ^ 기능 ^
| r | Read(읽기) | 4 | 파일/폴더의 내용을 읽음 |
| w | Write(쓰기) | 2 | 파일/폴더를 수정하거나 삭제함 |
| x | eXecute(실행) | 1 | 파일을 실행하거나 폴더 내 내용물을 확인함((폴더 "내부" 내용물을 확인하는 것은 Read 권한이 아니라 eXecute 권한의 영역이다. 따라서 r 권한이 있더라도 x 권한이 없다면 폴더가 어떤 파일을 포함하고 있는지 확인할 수 없다. 다만 이것과 별개로 폴더 내 파일에 r, w, x 권한이 있다면 그 파일을 직접 읽기/수정/실행은 가능하다.)) |
윈도우와 달리 리눅스는 파일마다 이렇게 권한 설정이 되어있고, \\
내가 만든 파일이라도 권한이 누락되어있을 경우 나조차 사용할 수 없다.\\
\\
''drwxrwxrwx'' 한 글자씩 그 의미를 따져보면,
^ d ^ r ^ w ^ x ^ r ^ w ^ x ^ r ^ w ^ x ^
| ''d''=폴더, ''-''=파일 | 읽기 | 쓰기 | 실행 | 읽기 | 쓰기 | 실행 | 읽기 | 쓰기 | 실행 |
| | Read | Write | eXecute | Read | Write | eXecute | Read | Write | eXecute |
| | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
| | 소유자 ||| 소유자 그룹 ||| 외부인 |||
하이픈(''-'')표시가 되어있는 것이 바로 그 누락된 권한이다. 즉, 위 사진에서 ''rwxr-xr-x''는 \\
- 소유자는 읽고 수정하고 실행 가능(''rwx'')
- 소유자 그룹에 속한 유저는 읽고 실행 가능(''r-x'') (수정''w'' 불가)
- 외부인은 읽고 실행 가능(''r-x'')
여기서 위 사진에서와 같이 파일을 ''ls -alh''로 모두 표시해보았을 때 ''root root''라고 뜨는 것이 각각 **소유자=''root''**와 **소유자 그룹=''root''ㄹㄴㅇㅁㄹㅈ **를 확인한 것입니다.
이런 방식대로 하면 "이 파일은 실행할 수 있는거야"를 명시적으로 표시할 수 있을 뿐더러\\
지정된 일부 유저 외 나머지는 접근을 제한하는 보안(보호) 조치를 겸하게 된다.\\
\\
다음 경우에서 ''test.sh''와 ''test2.sh''는 실행 가능한 내용이 들어있는 같은 내용의 파일이지만\\
''test.sh''는 x권한이 있는 반면 ''test2.sh''는 없다. 이 경우 각각을 **실행**했을 때,\\
{{https://img.kasimov.synology.me/reference/linux/basic-commands/x.jpg?500|}}\\
이와 같이 ''test.sh''는 정상적으로 실행되지만 ''test2.sh''는 ''Permission denied'', 즉 권한 부족 오류가 발생한다.\\
만약 이 상황에서 사용하려 하는 파일이 ''test2.sh''였다면 다음 명령을 이용한다.
chmod 권한 (설정할 파일/폴더)
chmod +x test2.sh # x권한을 추가(+)한다
chmod 755 test2.sh # 권한값을 변경한다
여기서 ''+x''는 ''x''권한을 파일에 추가한다는 의미로, ''x''(실행) 권한을 추가한다는 의미다.\\
만약 r이나 w권한을 추가하고자 한다면 ''+r'', ''+w'' 등으로 사용하면 된다.\\
''755''는 권한을 추가/제거가 아니라 직접 통째로 설정하는 것으로, 위 표에서 "값"을 이용한다.\\
예를들어, ''r'', ''w'', ''x''권한이 모두 필요한 경우 4+2+1 = 7이고,\\
''x''권한을 제외한 ''r'', ''w'' 권한만 필요하면 4+2+0 = 6이 되는 식이다.\\
이것을 소유자,
====1.2. 프로그램(앱) 이용하기====
**리눅스 배포판에 따라 차이가 있다.** 이 문서에서는 가장 널리 사용되는 Ubuntu 배포판을 기준으로 설명한다.
===1.2.1. 패키지(APT) 설치===
==1.2.1.1. 패키지 업데이트==
==1.2.1.2. 패키지 삭제==
===1.2.2. 실행파일 직접 이용===
===1.2.3. 소스코드를 컴파일하여 이용(고급)===
=====2. 화면 다루기=====
====2.1. 화면 내용 지우기: clear====
화면을 오래 써서 지저분하고 정신없다면
clear
를 눌러 청소할 수 있다.
====2.2. 이전에 실행한 것 불러오기====
명령어를 입력하는 곳에서 상/하 방향키를 누르면 이전에 입력한 명령어 목록을 탐색할 수 있다.\\
위로 올라갈수록 옛날, 아래로 내려올수록 최근 사용한 명령어이고\\
맨 마지막은 현재 입력하고 있는 명령어, 즉 (아무것도 입력하지 않았던 상태라면) 빈칸이다.\\
====2.3. 관리자 권한으로 실행하기====
=====3. 파일 다루기=====
ROS 프로그래밍 등 리눅스를 사용한 작업을 하다보면 모니터를 통한 그래픽 환경보다는 SSH 등을 통한 터미널 환경을 더 자주 접하게 된다.\\
리눅스는 라즈베리파이와 같은 초저사양 환경이나 머신러닝 학습 등 (극)고사양 장치의 성능을 극한으로 사용해야 할 때 주로 사용하는데,\\
그래픽 환경은 장치의 리소스를 많이 잡아먹기도 하고, 모니터가 반드시 필요한 탓에 제약사항이 많아 터미널 환경을 쓰게 되는 것이다.\\
그래서 리눅스가 설치된 장치에서 마우스 없이 작업파일을 직접 처리해야 할 때가 자주 있다.\\
또한, 일일이 작업하기 어려울 정도로 대량의 반복되는 작업을 "쉘 스크립트"로 자동화한다던지,\\
그래픽 환경이 제공되지 않는 프로그램을 사용해야 하는 경우에\\
파일을 조작하는 기초적인 명령어를 알고 있으면 큰 도움이 되므로 잘 알아두자.\\
====3.1. 파일 조회하기====
===3.1.1. 폴더 내에 목록 보기: ls===
현재 작업중인 위치에 있는 파일과 폴더 목록(list)을 표시한다. **L**i**s**t를 줄여 ''ls''가 되었다.\\
아무런 부가 옵션 없이 ''ls''만 실행하면 파일 명만 나오는데,
ls -alh
이렇게 하이픈(''-'')뒤에 알파벳으로 옵션을 주면(각 글자별로 의미가 있음) 좀 더 자세한 파일 정보가 포함된 파일 목록을 볼 수 있다. 여기서
^ 옵션 ^ 기능 ^
| a | 숨겨진 파일(파일명이 ''.''으로 시작하는 파일들)까지 보기 |
| l | 자세한 목록(파일 크기, 만들어진 날짜, 권한 등) 보기 |
| h | 파일 크기를 몇 바이트가 아니라, 사람(''h''uman)이 읽을 수 있는 단위를 붙여 보기 |
| R | 현재 위치에 하위 폴더가 있다면, 그 폴더 안에있는 파일까지 모두 표시. |
==3.1.1.1. 우분투 한정 단축 명령어==
아래 명령어들은 각각 같다.
la # ls -a 와 동일한 명령
ll # ls -l 과 동일한 명령
====3.2. 파일 생성/삭제/복사/이동====
===3.2.1. 파일 만들기: touch===
touch 파일명
현재 작업중인 위치에 크기가 0인, 아무 내용 없는 빈 **파일**을 만든다.
이 때
touch /전체/경로/파일명
이렇게 전체 경로를 다 포함하면, 현재 작업 중인 위치에 관계 없이 지정된 경로에 주어진 파일명으로 빈 파일을 만든다.
이 때, 파일명 앞 ''/전체/경로/''라는 폴더가 모두 존재해야 한다. 즉, ''/전체'' 폴더가 없거나 ''/전체''는 있는데 ''/전체/경로''가 없으면 안된다.
===3.2.2. 폴더 만들기: mkdir===
**M**a**k**e **Dir**ectory를 줄여 ''mkdir''이 되었다.
mkdir 폴더명
mkdir -p /전체/경로/폴더명
현재 작업중인 위치에 크기가 0인, 아무 내용 없는 빈 **파일**을 만든다.
여기서 ''-p''는, ''/전체/경로/''이라는 2 단계의 경로가 존재하는지에 관계없이 ''폴더명'' 폴더를 만든다.
''-p'' 없이 실행할 경우 ''touch'' 명령과 마찬가지로, 폴더를 만드려는 곳인 ''/전체/경로/''가 존재하지 않으므로 명령이 실행되지 않는다.
===3.2.3. 복사하기: cp===
**C**o**p**y를 줄여 ''cp''가 되었다.
cp 원본파일 새파일
===3.2.4. 이동/이름바꾸기: mv===
**M**o**v**e를 줄여 ''mv''가 되었다.
mv 기존파일(폴더) 새파일(폴더)
파일(폴더)의 위치와 이름을 바꾼다. 사용법이 매우 다양해 실제 예를 통해 알아보자.
\\
==3.2.4.1. 이름바꾸기==
mv memo.txt note.txt
mv folder directory
''memo.txt''파일을 위치 이동 없이 이름만 ''note.txt''로 바꾸었다.
''folder''라는 폴더(또는 파일일수도)를 위치 이동 없이 이름만 ''directory''로 바꾸었다.
\\
==3.2.4.2. 위치 이동==
mv /home/kasimov/memo.txt /home/kasimov/note.txt
''/home/kasimov''라는 폴더 내에 있는 ''memo.txt''파일을 위치 이동 없이 이름만 ''note.txt''로 바꾸었다. 현재 작업공간이 ''/home/kasimov''가 아니어도 작동한다.
mv /home/kasimov/memo.txt /home/kasimov/note/
새파일(폴더) 이름을 적는 대신 어떤 폴더를 적으면 그 **폴더에 집어넣**게 된다(맨 마지막의 슬래쉬''/''는 적지 않아도 무방). 이 때 파일(폴더)명 자체는 유지된다(위 사례처럼 파일 이름이 바뀌는 것이 아니다.)
\\
==3.2.4.3. 둘 다==
위 두 경우를 동시에 사용하면, 위치 이동과 이름 변경을 동시에 할 수 있다.
mv /home/kasimov/test1/memo.txt /home/kasimov/test2/note.txt
''test1'' 폴더에 있던 ''memo.txt'' 파일을 ''test2''폴더에 옮김과 동시에 ''note.txt''라는 이름으로 바꾸었다.