-
시스템 프로그래밍 실습 3주차 : Shell & Makefile & GitSystem Programming/Ubuntu Linux 2021. 9. 16. 15:30728x90
Shell & Makefile & Git
Shell
shell에도 여러 가지 종류가 있고 각 shell마다의 dialect이 있다! ( bash, sh, .... )
Redirection & Pipes
- file descriptors : 리눅스 혹은 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다.
흔히 유닉스 시스템에서 모든 것을 파일이라고 한다. 일반적인 정규파일부터 디렉토리, 소켓, 파이프, 블록 디바이스, 케릭터 디바이스 등 모든 객체들을 파일로 관리한다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때 파일 디스크립터라는 개념일 이용한다. 프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.
* standard file descriptors
- stdin (0) : keyword input
- stdout (1) : terminal output
- stderr (2) : terminal output for error messages
- Redirection : 표준 입력과 출력의 방향을 재지정한다. 즉, 모니터로 나와야하는 걸 파일로 지정할 수 있다!
( = standard I/O를 파일들로 리다이렉트한다 )
- > : redirect stdout for overwrite (create if not exist) : stdout 결과를 파일에 덮어쓴다
- >> : redirect stdout for append : stdout 결과를 파일에 추가하여 쓴다
- < : redirect stdin
- 2> : redirect stderr
- Pipe : 한 프로세스의 output을 다른 프로세스의 input으로 넣을 수 있다!
$ cat test.txt | grep "a"
-> test.txt의 내용을 화면에 보여주고, test.txt로부터 문자열 a가 있는 곳을 다 검색한다
예시)
shell 프로그래밍하는 두 가지 방안!
1) Line Command로 한 줄씩 입력 2) Shell Script 써서 한번에 실행
-> Shell Script 작성 방법!
- 첫 줄에는 #!/bin/bash나 #!/bin/sh와 같은 형태로 script를 해석하기 위한 프로그램을 특정한다
- 작성한 script를 실행 가능한 파일(executable file)로 만들기 위해 mode를 변경해야 한다
chmod +x test.sh
./test.sh
모드 변경 없이 쓸 때는 sh test.sh나 bash test.sh로 실행할 수 있다
- 일반 코드 작성하듯이 조건문이나 반복문을 통해 흐름을 제어할 수 있다
Shell 문법
1) Variables
- 선언을 통해 변수를 초기화할 수 있다.
- $를 통해 쉘 변수를 dereference할 수 있다
- echo를 활용하여 변수의 값을 확인할 수 있다
- shell predefined variables
- shell parameter variables
2) 조건문 -> if / else / elif
- 조건은 다음과 같이 쓸 수 있다
: if / elif / else 옆에 조건문을 쓰고, then을 쓴 후 실행문을 쓴다. 끝맺을 때는 fi로 끝낸다
3) 반복문 -> for / while
- for
: for 옆에 반복 조건을 써주고, do 다음에 실행문을 써준다. for문을 끝맺을 때는 done으로 끝낸다.
- while
Makefile
Makefile 쓰는 이유?
- source codes 간단하게 컴파일하기 위해
- files 간의 관계를 표현하기 위해서
- 각 파일들을 업데이트 하기 위한 command들을 제공하기 위해서
- 각각 바뀐 파일들을 다시 컴파일하기 위해서
Makefile 쓰는 방법
target의 prerequisites를 확인한 후, 해당하는 선수 조건을 target으로 하는 recipe을 먼저 수행한다. 선수 조건을 만족한다면 그때 target의 recipe을 수행한다.
예시)
- 다음과 같이 변수 또한 지정할 수 있다 또한 automatic variables 또한 사용할 수 있다
Git
Version Control System 중 하나
설치 : sudo apt install git
Git basic command
- git init
- git add "filename"
- git rm "filename"
- git commit
* options *
- -a
- -m
- git status
Git branch command
- git branch
- git checkout
- git merge
Git log command
- git log : commit 내역에 대해 보여준다
* options *
- -p : 각 커밋마다의 모든 변경 사항을 보여준다
- --stat : 각 커밋마다 변경된 파일들에 대한 통계(statistics)를 보여준다
- --name--only : 각 커밋마다 변경된 파일들의 이름만 보여준다
- --relative-date : relative data과 함께 커밋 로그를 보여준다
- --graph : 커밋한 기록들에 대해 그래프적으로 표현한다
.gitignore
: 부수적인 파일들은 용량을 차지하므로, 무시하도록 지정하는 것 !
+) 실시간 수업 당일날 이론 듣고 바로 문제를 풀어서 마칠 때까지 과제를 내야 한다는 게 너무 힘들었다. 정리도 못하고 제대로 이해도 못했는데 과제를 어떻게 푸나 싶었다! 그래서 대안을 좀 생각해봤는데 일요일에서 월요일로 넘어가는 저녁에 교안을 읽고 블로그에 정리를 하면서 이해하면 될 듯 싶다! 막상 이렇게 정리해보니 대강해서 냈던 과제도 온전히 잘 이해할 수 있었다!
728x90'System Programming > Ubuntu Linux' 카테고리의 다른 글
시스템 프로그래밍 실습 6주차 : Daemon (0) 2021.10.03 시스템 프로그래밍 실습 5주차 : Processes (0) 2021.09.27 시스템 프로그래밍 실습 4주차 : File I/O (0) 2021.09.20 시스템 프로그래밍 실습 2주차 : gcc & gdb (0) 2021.09.16 시스템 프로그래밍 실습 1주차 : 수업 개요 (0) 2021.09.02