ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시스템 프로그래밍 실습 3주차 : Shell & Makefile & Git
    System Programming/Ubuntu Linux 2021. 9. 16. 15:30
    728x90
    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.shbash 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
Designed by Tistory.