거의 모든 운영체제는 UINX 로부터 파생
Unix : C언어 기반
GNU (Gnu is Not Unix): Unix의 코드를 한 줄도 사용하지 않고 만든 Unix와 유사한 운영체제
// 누구나 쉽게 사용, 변형할 수 있도록 만들어 배포
Kernel (운영체제의 핵심 부분) 대학생 'Linus'가 만든 'Linux' Kernel.
리눅스 배포판 : ubuntu, Red Hat, CentOS, debian 등
GUI (Graphical User Interface)
CLI (Command Line Interface)
인자, 옵션
- 인자 : 커맨드가 작동할 대상을 지정하기 위해 사용
- 옵션 : 커맨드가 구체적으로 어떤 방식으로 동작할지를 지시하기 위해 사용
옵션
- 값을 줘야하는 옵션, 값을 주지 않아야 하는 옵션이 있음
- 옵션 여러 개를 동시에 쓸 때는 하이픈(-) 하나 뒤에 옵션들의 이름을 이어서 쓰는 방식이 있음
- 이때 값을 줘야하는 옵션이 있다면 값을 줘야하는 옵션을 가장 뒤에 써야 커맨드가 정상적으로 동작
$ cal 2030 // 2030 : 인자(argument), 커맨드의 동작 대상 지정
공식 매뉴얼
man 궁금한 커맨드
$ man cal // cal : 인자
q : 나가기
data 라는 커맨드에 대해 더 자세히 알고 싶어서 man date라고 실행했을 때의 결과
색깔별로 구분한 영역들은 순서대로 다음과 같음
1. 섹션, 매뉴얼 이름 : DATE(1)에서 1은 공식 매뉴얼의 전체 내용 중 몇 번째 섹션에 해당하는 곳인지를 의미
대부분의 유닉스 계열의 운영체제는 아래와 같은 여러 섹션으로 구성된 공식 메뉴얼을 갖고 있음
SectionDescription
1 | General commands |
2 | System calls |
3 | Library functions |
4 | Special files and drivers |
5 | File formats and conventions |
6 | Games and screensavers |
7 | Miscellanea |
8 | System administration commands and daemons |
지금 당장 이 표의 단어들의 의미를 다 알 필요는 없음
우리가 사용하는 대부분의 커맨드들이 섹션 1. General commands에 속한다는 사실만 알고 있으면 됨
2. NAME : 커맨드의 이름과 커맨드에 대한 간단한 설명
3. SYNOPSIS : 어떻게 커맨드를 실행할 수 있는지, 사용 가능한 형식(인자, 옵션들의 조합)을 보여줌.
지금 보면 대괄호 안에 있는 것들(-jRu)이 사용 가능한 옵션을 나타냄. 그리고 대괄호 없는 new_date 같은 것이 인자.
4. DESCRIPTION : 커맨드에 대한 좀더 자세한 설명과 각 옵션에 대한 설명
경로 확인
bagchaecBookPro:~ chaeyeon$ // ~ : 틸드(Tilde); 현재 사용자의 홈 디렉토리
pwd (Print the name of Working Directory) // 현재 작업중인 디렉토리 출력
bagchaecBookPro:~ chaeyeon$ pwd
/Users/chaeyeon
~ == /Users/chaeyeon // ~ 과 /Users/chaeyeon 같은 뜻
최상위 디렉토리[루트디렉토리] : 가장 상위에 있는 디렉토리
cd ; change directory
cd .. 단순 상위 디렉터리로 돌아가는 것
cd - 현재 디렉터리로 이동하기 전의 디렉터리로 돌아가는 것
/home/user 에서 /home/user/dir1/dir2 로 절대 경로를 사용해서 이동했을 때,
cd .. 를 사용하면 /home/user/dir1 로 이동
cd - 를 사용하면 /home/user 로 이동
현재위치가
/Users/chaeyeon/Pictures 일 때
절대경로
/Users/chaeyeon/Pictures
상대경로
./Pictures
. : 현재 위치한 디렉토리
.. : 현재 디렉토리를 포함하는 부모 디렉토리
절대경로 : 루트디렉토리를 기준으로 어떤 파일이나 디렉토리가 가지고 있는 고유한 경로
상대경로 : 나의 현재 위치를 기준으로 나타낸 경로
상대경로가 절대경로보다 유용한 경우
1. 만약 현재 경로가 루트 디렉토리에서 멀리 있는 상황에서 그 주변의 경로를 나타내야할 때
예를 들어 현재 디렉토리가 Users/codeit/Programming/Java 일 때
/Users/codeit/Programming/Python이라는 디렉토리로 이동하는 경우
절대경로
cd /Users/codeit/Programming/Python
상대 경로로는
cd ../Python
2. 어떤 프로그램의 호환성을 좋게 할 때. (그 프로그램의 소스 코드 내에서는 상대 경로를 써야함)
(1) 사용자 codeit의 홈 디렉토리 안에 '포켓몬 게임'을 위해 Poketmon이라는 디렉토리가 있다고 가정
(2) 그리고 그 안에는 게임 실행 프로그램인 start_game,
(3) start_game 파일이 실행될 때 필요로 하는 설정 파일들이 들어있는 settings라는 디렉토리가 있음
(4) 그리고 settings 디렉토리 안에 있는 것들 중에는 캐릭터에 관한 설정을 할 수 있는 character_setting 파일이 들어있음
정리하면 다음의 경로의 디렉토리와 파일들이 있는 것.
(1) /Users/codeit/Poketmon 디렉토리
(2) /Users/codeit/Poketmon/start_game 파일
(3) /Users/codeit/Poketmon/settings 디렉토리
(4) /Users/codeit/Poketmon/settings/character_setting 파일
그리고 (2)의 start_game 의 소스 코드 중에는 (4)를 가리키기 위해 다음과 같이 절대 경로를 사용한 부분이 있다고 가정.
def setUp(): my_setting = load("/Users/codeit/Poketmon/settings/character_setting") ~~~
사실 이 게임은 codeit 사용자가 자기 컴퓨터로 만든 게임이라서 character_setting 파일의 경로를 그냥 절대 경로로 표현.
그래도 codeit 사용자가 이 컴퓨터에서 게임을 하는 데는 아무런 문제가 없음.
하지만 이 포켓몬 게임이 정말 재밌어서 Tom이라는 다른 사용자에게도 해보라고 Poketmon 디렉토리를 줬다고 하면 문제는 발생
Tom은 자신의 홈 디렉토리에 Poketmon 디렉토리를 그대로 두면 이때 character_setting 파일의 절대 경로는
/Users/Tom/Poketmon/settings/character_setting
그런데 이렇게 되면 바로 위의 코드 블록 중
load("/Users/codeit/Poketmon/settings/character_setting") // 이 부분에서 에러 발생
왜냐하면 Tom의 컴퓨터에 codeit이라는 디렉토리는 없기 때문
해결 방법
지금 파일이 start_game 이기 때문에 start_game을 기준으로 한 상대 경로로 나타내면 됨
load("../settings/character_setting")
이렇게 나타내면 Poketmon 디렉토리를 어느 컴퓨터로 옮기더라도 에러가 발생하지 않음. 왜냐하면 어느 상황이더라도 start_game
의 입장에서 character_setting 파일의 상대적인 위치는 똑같기 때문.
이런 이유 때문에 프로그램의 소스 코드 내에서 경로를 표시할 때는 상대 경로로 써주는 게 좋음
그래야 그 프로그램이 완성되고 나서 다른 환경으로 옮겨졌을 때에도 아무런 문제 없이 실행될 수 있기 때문 (호환성 위해)
mv 커맨드 동작 방식
1. 파일 / 디렉토리의 이름 변경
2. 파일 / 디렉토리의 위치 이동
언제 1로 작동하고, 언제 2로 작동하는 건지?
1. 파일을 옮기는 경우
mv file DEST
(1) DEST가 나타내는 경로가 이미 존재하는 디렉토리라면 그 디렉토리 안으로 file이 이동
(2) DEST가 나타내는 경로가 아직 존재하지 않는 경로라면 그 경로명대로 이름 변경 혹은 위치 이동 혹은 둘 다를 할 수도 있음
- DEST가 file2면 이름만 file2로 바뀜
- DEST가 ../file이라면 위치 이동만 함
- DEST가 ../file2라면 이름 변경도 되고 위치 이동도 함
주의사항
이동하게 되는 디렉토리 안에 DEST와 이미 같은 이름의 파일이 있으면 그 파일을 덮어쓰게 됨
이런 일을 방지하기 위해 mv 커맨드를 쓸 때 -i 옵션을 줘야함
i ; interactive // 혹시 덮어쓰게 될 상황이 생기면 바로 덮어쓰지는 않고 사용자의 의견을 물어보겠다는 뜻
나도 모르게 파일을 덮어쓰는 일을 방지하기 위해
mv -i file ../alreadyExists
이런 식으로 입력
그럼 터미널에서 "overwrites ../alreadyExists?" 가 출력되면서 정말 덮어쓸 건지를 물어봄
이때 y(yes)를 입력하면 덮어써지게 되고, n(no)를 누르면 아무 일도 일어나지 않음.
-i 옵션을 주지 않으면 우리도 모르는 사이에 덮어써버릴 수도 있으니 조심.
2. 디렉토리를 옮기는 경우
mv dir DEST
(1) DEST가 나타내는 경로가 이미 존재하는 디렉토리라면 그 디렉토리 안으로 dir가 이동
(2) DEST가 나타내는 경로가 아직 존재하지 않는 경로라면 그 경로명대로 이름 변경 혹은 위치 이동을 혹은 둘 다를 할 수도 있음
- DEST가 dir2면 이름만 dir2로 바뀌겠죠?
- DEST가 ../dir라면 위치 이동만 함
- DEST가 ../dir2라면 이름 변경도 되고 위치 이동도 함
만약 DEST가 이미 존재하는 파일의 이름이라면?
이렇게 되면 에러 메시지가 출력되면서 아무 동작도 일어나지 않음 // 하나의 디렉토리 안에는 같은 이름의 것들이 존재할 수 없기 때문
Vim 정리
- Vim 공식 사용 설명서(https://vimhelp.org/#help.txt)
- Vim을 게임처럼 재미있게 배울 수 있는 사이트(https://vim-adventures.com/)
아래는 이번 챕터에서 배운 내용 정리
1. 사용 모드 전환
실제로는 이것보다 더 다양한 방식으로 이동이 가능하지만 이 그림에 있는 키들만큼은 꼭 기억하기
2. 각 모드에서 할 수 있는 작업
1. 기본 모드(Normal mode)
기능키
왼쪽으로 이동 | h |
오른쪽으로 이동 | l |
아래쪽으로 이동 | j |
위쪽으로 이동 | k |
5칸(왼쪽, 오른쪽, 아래쪽, 위쪽)으로 이동 | 5(h/l/j/k) |
커서가 있는 줄의 첫 번째 칸으로 이동 | 0 |
커서가 있는 줄의 마지막 칸으로 이동 | $ |
파일의 첫 번째 줄로 이동 | gg |
파일의 마지막 줄로 이동 | G |
한 글자 삭제 | x |
5글자 삭제 | 5x |
한 줄 삭제 | dd |
5줄 삭제 | 5dd |
작업 취소 | u |
텍스트 붙여넣기 | p(커서 다음 칸 혹은 다음 줄) |
텍스트 붙여넣기 | P(커서 이전 칸 혹은 이전 줄) |
2. 입력 모드(Insert mode)
기능키
커서 위치부터 바로 입력 모드 시작 | i |
커서 위치를 바로 다음 칸으로 옮기고 입력 모드 시작 | a |
커서 위치를 그 줄의 첫 번째 칸으로 옮기고 입력 모드 시작 | I |
커서 위치를 그 줄의 마지막 칸으로 옮기고 입력 모드 시작 | A |
커서 위치를 바로 다음 줄로 옮기고 입력 모드 시작 | o |
커서 위치를 바로 이전 줄로 옮기고 입력 모드 시작 | O |
3. 명령 모드(Command mode)
기능키
입력 내용 저장하기 | :w |
vim 종료하기 | :q |
입력 내용 저장하고 바로 vim 종료하기 | :wq |
수정사항 반영하지 않고 그대로 vim 종료하기 | :q! |
특정 텍스트 검색 | /keyword |
특정 텍스트 검색 시 다음 텍스트로 이동 | n |
특정 텍스트 검색 시 이전 텍스트로 이동 | N |
커서가 있는 줄의 첫 번째 해당 텍스트 교체하기 | :s/old/new |
커서가 있는 줄의 모든 해당 텍스트 교체하기 | :s/old/new/g |
모든 줄의 모든 해당 텍스트 교체하기 | :%s/old/new/g |
모든 줄에서 모든 해당 텍스트를 하나씩 확인하면서 교체하기 | :%s/old/new/gc |
4. 비주얼 모드(Visual mode)
기능키
일반 블록 지정 | v |
줄 단위 블록 지정 | V |
텍스트 복사 | y |
텍스트 잘라내기 | d |
외부 프로그램 설치
macos : homebrew
ubuntu : apt
sudo
sudo apt install ~~~~~
이때 맨 앞에 sudo 라고 쓴 이유
: 시스템에 프로그램을 설치할 때는 일반 사용자가 아닌 그보다 더 높은 관리자 권한이 필요하기 때문
꼭 외부 프로그램을 설치할 때가 아니더라도 유닉스 시스템에서 종종 쓰일 때가 있음
- 시스템 내에서 일반 사용자는 하지 못하고 오로지 관리자 계정으로만 할 수 있는 작업들을 해야할 때
(이 부분을 더 잘 알려면 유닉스에서 사용자 권한(permission)이라고 하는 부분을 배워야함)
(일단 관리자 계정으로서의 권한을 갖고 어떤 작업을 해야할 때 sudo 를 가장 맨 앞에 써줘야 한다는 것 기억하기)