4. Shell script & make SPARCS 13 KAIST CS 12 argon
Contents – Shell script Shebang PATH 명령어 변수 인수전달 조건문 반복문 함수 배열 [실습] Cron 만들기
Shell Script? Shell(Unix shell)을 위해 쓰인 스크립트
Shell? User와 System간의 대화를 중계 명령어를 해석, Kernel에 전달 Bash, sh, csh, ksh, zsh, tc Shell 등 다양한 shell이 존재
Script? 스크립트 언어(Scripting language)! 응용소프트웨어를 제어 최종사용자가 응용프로그램의 동작을 사 용자의 요구에 맞게 수행할 수 있도록 함
Shell script! Shell(Unix shell)을 위해 쓰인 스크립트! 더 확장된 의미로는 이들 명령어들을 한 파 일에 모아놓아 단일 명령으로 사용할 수 있 게 만들어놓은 파일 스크립트 언어(scripting language)란 컴퓨터 프로그래밍 언어로서 응용 소프트웨어를 제어한다. 스크립트 프로그래밍 언어라고도 한다. 스크립트 언어는 응용프로그램과 독립하여 사용되고 일반적으로 응용프로그램의 언어와 다른 언어로 사용되어 최종사용자가 응용프로그램의 동작을 사용자의 요구에 맞게 수행할 수 있도록 해준다. 스크립트(scripts)는 연극 용어인 스크립트에서 유래되었으며 초창기 스크립트 언어는 배치언어(batch languages) 또는 작업 제어 언어(job control language)라고도 불리었다.(http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%96%B8%EC%96%B4)
Why Shell script? In wiki – 컴파일 단계가 없으므로 실행이 다른 언어에 비해 빠른 경우가 많다 동일한 작업의 반복 / 여러 명령어들의 입력을 통한 복잡한 작업을 한 파일에 모 아 단일 명령으로 사용!
About shell script(1) - Shebang 모든 Shell script는 Shebang line으로 시 작한다. Shebang line 이후의 명령들을 어떻게 해 석할 것인지 지정
About shell script(2) - Shebang Shebang line의 구문(Syntax) #!interpreter [optional-arg] Ex) #!/bin/sh #!/bin/csh –f #!/usr/bin/perl -T
About shell script(3) - $PATH(환경변수) /usr/bin/env는 사용자의 $PATH(환경변 수)상에서 첫 번째로 찾은 해당 명령을 실 행 ex) #!/usr/bin/env python 환경변수 상에 기재된 파이선 PATH 중 가 장 먼저 오는 것을 실행
About shell script(4) – 명령어 Bash shell 기준, 자주 쓰이는 명령어 $ echo [str]: 뒤에 전달되는 str을 출력 $ grep [str] [file]: file안에서 str을 찾는다. $ file [filename]: filename의 filetype을 출력 $ read var: 입력값을 변수 var에 대입 $ tee [filename]: 표준출력을 file에 쓰기 $ basename [file]: 디렉토리명을 제외한 파일명 $ dirname [file]: 파일이름 제외한 디렉토리명 $ pwd: 현재 경로 Portable Operating System Interface 유닉스 운영체제에 기반을 두고 있는 일련의 표준 운영체제 인터페이스이다. 표준화에 관한 필요성은, 컴퓨터를 사용하고 있는 기업들이 다시 코딩하지 않고서도 다른 컴퓨터 회사가 만든 컴퓨터 시스템에도 운영할 수 있도록, 호환성이 있는 프로그램의 개발을 원하는 데에서 기인했다.
About shell script(5) – Hello world! $vi hello #!/bin/sh echo “hello world!”
About shell script(6) – Hello world! 실행해봅시다 ./hello 안 되죠?
About shell script(7) – Hello world! Linux에서 기본적으로 파일은 실행권한이 없음 실행권한 부여 // $chmod +x hello $./hello 혹은 sh hello로 실행
About shell script(8) – 변수선언 변수 선언 name=argon age=19 =양쪽으로 공백이 있으면 안 된다. 변수 호출 변수를 호출할 때는 $를 사용
About shell script(9) – 변수입력 변수 입력 받기 read [변수명]
About shell script(10) – 특수 변수 특수한 변수 $$ : Shell 자신의 PID $! : Shell이 마지막에 실행한 background process PID $* : 인수 전체의 list 하나의 달라붙어있는 형태 $@ : 인수 전체의 list, 각각 “”로 묶여서 전개 # : Shell에 부여된 인수의 개수 $0 : Shell 자신의 file명 $1 ~ $n : Shell에 부여된 인수의 값(순서대로) $? : 이전에 수행한 명령이 성공했는가? (성공 0)
About shell script(11) – 인수 전달
About shell script(12) – 연산자 + - / \* %
About shell script(13) – 조건문 if if [condition1] then commands elif [condition2] else fi //if문의 끝
About shell script(14) – 조건문 if if [condition1]; then commands elif [condition2]; then else fi //if문의 끝
About shell script(15) – case case $변수 in 0) commands;; 1) commands;; esac //case문의 종결
About shell script(16) – 제어문 &&: 앞의 조건식이 참일 때 실행 ||: 앞의 조건식이 거짓일 때 실행
About shell script(17) – 조건식 조건식은 [ ]로 묶임 파일식: 파일의 속성 검사 [ -f ”file” ]: file 이 파일인지를 테스트 [ -x “/usr/games/sl” ]: /usr/games/sl이 실행파일인지 아닌지 테스트 문자열식: 문자열을 검사 [ -z “$var” ]: $var의 문자열의 길이기 0인지 테스트 [ -n “$var” ]: $var의 문자열 길이가 0인지 아닌지 테스트 [ “$a” = “$b” ]: $a와 $b가 같은가 테스트 숫자 비교 연산자: -eq: == -ne: != -ge: >= -gt: > -le: <= -lt: <
About shell script(18) – 반복문 while [Condition] do commands done until [Condition] do commands done 리스트의 값들이 차례로 변수에 넣어지고 리스트에 있는 값의 개수만큼 반복 for 변수 in [list] do commands done for ((i=0; I < 10; i++)) do commands done
About shell script(19) – 함수 functionname() { commands } 호출은 functionname
About shell script(20) – 배열 declare –a array (크기 지정 없이 배열을 선언) array[1]=k 와 같이 접근, 호출은 변수와 마찬가지로 ${array[1]}
실전! – Cron 만들기 Cron? 정해진 시간마다 정해진 작업을 하는 Unix의 background process의 명칭 http://cafe.naver.com/daousw/489
실전! – Cron 만들기 바로 이렇게!
실전! – Cron 만들기 일단, 아래와 같이 시작합니다. date +%Y 는 원래 연도를 가르쳐주는 명령어
실전! – Cron 만들기 전달받은 인수의 개수가 올바른지 확인 올바르지 않은 경우 Usage를 출력한 뒤 exit
실전! – Cron 만들기 서버로부터 시간 정보 가져오기
실전! – Cron 만들기 이제부터 시작! Hint: 서버로부터 가져온 시간과 현재 시간 이 일치하는가 확인 아직 시간이 남았다면 sleep을 사용합시다. 실행에는 . ${변수명} 을 사용 ?
Contents – make make? Makefile syntax Example Parallel build Clock skew dependency
make? linux에서 제공하는 하나의 유틸리티 현재 디렉토리에 있는 Makefile 또는 makefile 이란 일정 규칙하에 만들어진 file의 내용을 읽 어 목표 file을 생성
Makefile Syntax Makefile도 결국 Shell Script와 유사한 syntax Command 전에는 항상 TAB #으로 시작하는 행은 주석 이외의 자세한 문법은 http://www.gnu.org/software/make/manual/make.html
make & Makefile make의 목표 가장 적은 단계를 거쳐 파일 생성 Makefile에 파일 생성을 위해 필요한 파일들에 대해 기록해둔다. 파일 생성을 위해 필요한 파일들 중 변경된 파일이 있는지 Timestamp를 가지고 추적.
Makefile Example GcdLcm: main: main함수를 포함 GcdLcm.c: GCD, LCM 함수 정의 GcdLcm.h: GCD, LCM 함수 선언
Makefile Example GcdLcm.h GcdLcm.c
Makefile Example main.c
Makefile Example Makefile
Makefile Example make 한 번 더?
Parallel build 일반적으로 make는 한 번에 한 file을 생성 -j 혹은 –jobs 옵션을 통해 동시에 여러 파일 을 생성하도록 할 수 있음. Ex) –j4 : 4개의 프로세스를 생성하여 make (즉 동시에 4개의 작업을 수행)
Clock skew 시스템의 시간과 컴파일 하고자 하는 소스 파일의 시간이 맞지 않음 해결방법 Make: warning: Clock skew detected. Your build may be incomlete 시스템의 시간과 컴파일 하고자 하는 소스 파일의 시간이 맞지 않음 Ex) 시스템의 시간보다 미래에 저장된 소스파일 해결방법 소스 파일들의 access와 modification 시간을 현재시간으로 업데이트
dependency 어떠한 차례로 컴파 일 해야 할 것인가? 병렬 컴파일이 가능 한 파일들은 무엇인 가? main.c GcdLcm.c GcdLcm.h main.o GcdLcm.o GCDLCM 어떠한 차례로 컴파 일 해야 할 것인가? 병렬 컴파일이 가능 한 파일들은 무엇인 가? 어떤 파일이 변경된 다면 얼마만큼의 재 컴파일이 필요한가? 순환참조가 있는가? http://jacking75.cafe24.com/Boost/graph/file_dependency_example.html
References http://ingorae.tistory.com http://smeffect.tistory.com http://www.gnu.org/software/make/manual/make.html http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%96%B8%EC%96%B4 http://kukuta.tistory.com http://kyagami.blog.me http://cafe.naver.com/daousw/489 http://www.gnu.org/software/make/manual/html_node/Parallel.html http://blog.naver.com/juner84?Redirect=Log&logNo=100129369041 http://jacking75.cafe24.com/Boost/graph/file_dependency_example.html
Citation 2011 Wheel Seminar - 08. GCC and Shell Script 정창제 선배님
수고하셨습니다.