유닉스셸 (Unix Shell) 실습컴퓨터 csmail.incheon.ac.kr incheon ac (117.16.244.56) 16 multi.incheon.ac.kr (117.16.244.57) gnu.incheon.ac.kr (...) csblade.incheon.ac.kr (...) 1 VMware 사용하거나 2 윈도우 시작 메뉴에서 실행 선택해서 telnet csmail.incheon.ac.kr 또는 telnet 117.16.244.56 login: stu passwd: *******
3. 유닉스셀 (Unix Shell) 셀이란? 기본지식습득 쉘의기능 유틸리티 kill ps echo nohup sleep 셀명령어 echo kill umask exec shift exit eval login wait tee Unix/Linux 2
소개 유닉스셀 (Unix Shell) 사용자와순수 Unix 운영체제사이를연결하는프로그램 Unix Shell의종류 : 대표적인 3종류의 Shell Korn Shell David Korn 이제작, Bourne Shell 보다 포괄적, 산업체에서선호, 유망 Bourne Shell Stephen Bourne이제작, 최초의대중화된 Unix Shell Bash Shell(Bourne-Again Shell) 의전신 C Shell Bourne Shell 후에작성됨, C 언어와밀접한 구조와관계 Unix/Linux 3
소개 Unix 시스템셸 Bourne Shell(Steven Bourne, AT&T) sh $.profile ( 실행은 $..profile) 프로그래밍기능 C Shell(Bill Joy, Berkeley) csh %.login.cshrc ( 실행은 % source.cshrc) Bourne shell +» 대화형명령입력» 별명 (alias)» history Korn Shell(Dave Korn) ksh $.profile ( 실행은 $..profile) Bourne shell + C shell Bourne-Again Shell.bash_p profile.bashrc.bash_ logout (.bash _ login 은호출않음 ) 모든로그인사용자공통메시지 : /etc/motd Unix/Linux 4
.bash_profile 셸환경변수 : $HOME, $PATH, $SHELL, $TERM, $LOGNAME, $PS1, $PS2, $IFS 프롬프트설정 PS1= $PWD \$ PS1= \$PWD \$ ($PWD의실행이 shell의해석으로부터보호되어매프롬프트생성때마다실행됨 ) PS1= \u@\h \w \$.bash_profile 안에자기취향의 PS1 설정하고..bash_profile로실행시켜적용 프롬프트에사용할수있는제어문자 \t 현재시간 ( 시 : 분 : 초형식 ) \d 오늘날짜, 요일 ( 요일월일형식 ) \n new line \s 현재셸이름, $0의값 \w 현재작업디렉토리의이름 ( 전체경로까지 ) \W 현재작업디렉토리의이름 ( 현재위치만 ) \u 사용자이름 \h 호스트이름 \# 셸이기동한후로부터의명령의번호 \! 실행하는명령의 history 번호 \$ 프롬프트모양 uid가 0, root이면 #, 그렇지않으면 $ \nnn ASCII 코드 nnn에해당하는문자 \\ 백슬래시 \[ 제어문자라쓸수없는문자를사용하기위해서는 [ 로시작 \] 제어문자의끝 Unix/Linux 5
셸의기능 셸기능 내장명령어스크립트변수리다이렉션대표문자파이프명령열서브셸후면처리명령어치환 지역환경조건부무조건부 Unix/Linux 6
셸선택 계좌개설시선택명시 /etc/passwd/ 화일안에 login shell 정보저장 자신의 login shell 이무엇인지를확인하는법 $ echo $SHELL 현재실행중인 shell hll 이무엇인지를확인하는법 $ ps Shell 호출및환경설정 1 자동호출 login시에특정시작화일을읽어서 shell을시작 Bourne Shell :.profile C Shell :.login,.cshrc Korn Shell :.profile Bourne-Again Shell :.bash_profile,.login,.bashrc 2 수동호출 /bin/sh:..profile /bin/csh: source.cshrc /bin/ksh:..profile /bin.bash:..bash_profile Unix/Linux 7
셸운영 기본적인 ( 공통적인 ) shell 기능 다수의내장명령어제공 메타문자제공 입력 / 출력 / 오류의 redirection 기능제공 대표문자들 (wildcards) 를이용하여화일이름대치 파이프라인기능 명령어대치 조건부 / 무조건부명령열 (sequences) 작성 subshell bhll 생성 후면처리 (background processing) Shell Script( 프로그램 ) 를작성할수있도록해줌 환경변수와지역변수를가짐 인용 (quoting) 작업제어 Unix/Linux 8
실행가능한파일과내장명령어 다수의내장명령어제공 Unix machine에서 man shell_builtins 로내장명령어확인 (cf.) utility program과의차이 : shell에내장, search path에서찾기전에실행 정보를표시 : echo 모든명령어인자 (arg) 들을표준출력 ( 화면 ) 에표시해줌 C shell, Bash shell에서 $ echo n {string}* -n 출력에 newline을생성 (default) 하지않도록해줌 Bourne shell에서 $ echo {string}*» 제어문자표시 : $ echo string 큰따옴표안에표기 \b backspace \c print line without new-line (Bourne shell에서사용 ) \f form-feed \n new-line \r carriage return \t tab \v vertical tab \\ backslash \0n where n is the 8-bit character whose ASCII code is the 1-, 2- or 3-digit octal number representing that character ( 예 ) $ echo Please enter your name: \c Unix/Linux 9
ASCII Code * 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI 1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2! " # $ % & ' ( ) * +, -. / 3 0 1 2 3 4 5 6 7 8 9 : ; < = >? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { } ~ Unix/Linux 10
실행가능한파일과내장명령어 다른내장명령어예제 : cd, eval, exec, shift, umask $ cd 작업디렉토리를새로운위치로바꾸어줌 $ eval `command` backquote, grave accent( ) 안의 command 수행결과를정규셀명령으로간주하여실행 (Bash shell 예 )$echo x=5 와 $ echo $x $ eval `echo x=5` 의차이점 $ echo $x (C shell 예 ) % echo set x=5 와 % eval `echo set x=5` 의차이점 $ exec command 현재의 shell process 가 command 를수행하는 shell process 로대치됨» 따라서 command가성공적으로수행되면, exec process는사라짐특히, exec의 process가 login shell이면, logout 되어버림» ( 시스템호출 fork + exec 참조 ) ( 예 )$ exec date Unix/Linux 11
실행가능한파일과내장명령어 $ shift 명령어인자들의위치를왼쪽으로하나씩옮김, 첫번째인자 ($1) 은없어지므로이동할명령어인자가없으면에러메시지가나옴 ( 예 )$ cat shift.bash ( 또는 shift.sh) sh) [ 교재 p156 참조 ] #! /bin/bash ( 또는 /bin/sh) echo first argment is $1, all args are $* shift echo first argment is $1, all args are $* $ shift.bash a b c d echo first argment is a, all args are a b c d echo first argment is b, all args are b c d $ umask k( (user mask) [8 진수 ] ( C shell hll 은 builtin i 아님 ) 화일생성시, 이에대한접근에관한허가권에대하여 masking을수행 default 값 : 0022 ( 그룹과다른사람들에대하여쓰기금지 ) masking( 가림 ) 의원칙 ( 예 )fd = open("myfile", O_CREAT O_RDWR, 0666) -rw-r--r-- (0644) $ umask 현재의마스크값을인쇄해줌 $ umask 0 no masking -rw-rw-rw-(0666) Unix/Linux 12
메타문자 기호의미기호의미 > 표준출력을파일에저장하는 ; Shell 명령어를순서대로구분하여출력 redirection 나열할때사용하는분리자 >> 표준출력을파일에추가저장하는출력 redirection 이전의명령이실패하면실행하도록하는조건부명시 < 표준입력을파일에서읽어들이는입력 redirection && 이전의명령이성공하면실행하도록하는조건부명시 word 바로전줄까지를임시화일에저장한후이화일을표준입력으로읽어들이는입력 redirection <<word \ here document << 을사용하는 script를말합 Shell의메타문자앞에붙어서메타문자의특수의미를제거함 $ echo hi > file $ echo hi \> file Unix/Linux 13
메타문자 기호 의미기호의미 * 0개이상의문자와일치하는 (...) 화일치환대표문자 단일문자와일치하는? & 화일치환대표문자 그룹명령어 후면실행 (background processing) [...] [ 와 ] 사이의어떤문자와도일치하는화일치환대표문자. 문자의범위는대쉬 (-) 로표현 # Newline 까지를설명문으로간주하여처리함 `command` 명령어 command의출력에의해서대치되는명령어치환 $ 변수접근 어떤프로세스의출력을다른프로세스의입력으로보내주는 pipe Unix/Linux 14
리다이렉션 Rdi Redirection i 표준파일들 표준입력 (standard input) : fd (file descriptor) = 0 표준출력 (standard output) : fd = 1 표준에러 (standard error) : fd = 2 출력 / 입력 / 에러 Redirection : 메타문자표참조 $ cat > test.txt... ^D # 출력 redirection( 생성 ): 존재하면 truncate (overwrite) # $ set o noclobber truncate 방지 $ cat >> test.txt... ^D # 출력 redirection( 추가 ) $ mail mysung < letter (.mailrc에그룹정의) # 입력 redirection Unix/Linux 15
리다이렉션 $ cat here.sh #here document0 #EndOfMail의직전줄까지읽어서메일내용으로보냄 mail $1 <<EndOfMail Dear $1, Good Morning! -from $LOGNAME Haveaniceday! a EndOfMail # 공백없이첫째칸부터입력 echo mail sent to $1 $ chmod +x here.sh $ here.sh mysung mail sent to mysung $ mail...? 1...??? q 표준에러처리 Borne 셸, Bash 셸 C 셸 $ man ls > ls.txt 2> err.txt # 표준에러를 err.txt 라는화일에 redirection $ man ls > ls.txt 2>&1 # 표준에러를표준출력에연계시킴 % (man ls > ls.txt) >& err.txt # 표준출력을 ls.txt 에표준에러를 err.txt 라는화일에 redirection % man ls >& all.txt # 표준에러를표준출력에연계시킴 ( 표준출력과표준에러를한파일에 ) Unix/Linux 16
화일이름대치 (wildcards) Wildcard 들을이용한화일이름대치 $ ls -FR a.c b.c cc.c dir1/ dir2/ dir1: d.c e.e dir2: f.d g.c 교재 p126 예제 $ ls *.c a.c b.c cc.c $ ls?.c a.c b.c $l ls [ac]* a.c cc.c $ ls [A-Za-z]* a.c b.c cc.c dir1: dcee d.c e.e dir2: f.d g.c $ ls dir*/*.c dir1/d.c dir2/g.c $ ls *2/?.??.? a.c b.c dir2/f.d dir2/g.c Unix/Linux 17
파이프 (pipes) 파이프라인기능 $ command1 command2 command3 $ ls wc -w $ ls -l wc -l $ who tee who.capture sort #who 의출력을화일에복사저장한후이를정렬함 tee -ia {filename}+ 표준입력을명시된화일과표준출력에동시복사 -a( 화일에추가저장 ) -i( 인터럽트무시 ) cat /etc/passwd awk F: { print $1 } sort awk는 [ 교재 7. 유틸리티, 7.8 프로그램가능한텍스트처리 : awk 참조 ] Unix/Linux 18
명령어대치 그레이브액센트부호 (`) 로둘러싸인명령어는표준출력으로대치 $ echo there are `who wc -l` users on the system $ vi `grep -l debug *.c` # debug 패턴을포함하며.c로끝나는모든화일들을 vi 편집 grep, fgrep, egrep: 명시된패턴이있는 / 없는줄만을여과 화일여과 utility [ 교재 7. 유틸리티, 7.2 파일여과참조 ] grep/frep/egrep - hilnvw pattern {filename}* -n ( 줄번호표시 ) -i( 대소문자무시 ) -l( 화일목록 ) -v ( 일치하지않은줄 ) -w( 단어단위로탐색 ) 명시된화일이없으면표준입력을탐색한다. pattern : grep( 정규식 ) fgrep( 일정한문자열만 ) egrep( 확장된정규식 ) ( 예 )$ grep the grepfile ( 예 )$ grep -nw the grepfile Unix/Linux 19
정규표현식 (7 장 grep 참조 ) 정규식의예 [ 교재 p296, p780 참조 ] ( 주의1) 반드시단일따옴표안에! ( 주의 2) *, +,? 은이전문자에적용됨 grep, egrep 정규표현식 :. [] * ^ $ \ ( 예 ).nd ^.nd sw.*ng [A-D] \. a.a.$ a.$ im*inging egrep 확장정규표현식 : +? () ( 예 ) s.*w s.+w off will im*ing im?ing 정규표현식 : grep 특수문자. 임의의단일문자 [] 괄호안의단일문자중어느것과일치 * 문자다음에나타남, 바로앞의문자가 0번 h는그이상발생 ^ 줄의시작, [] 안에서는제외 (except) 의미 $ 줄의끝 \( 백슬래시 ) 메타문자앞에위치, 메타문자의특수의미제거 확장정규표현식 : egrep 특수문자 + 단일문자가 1번이상발생? 단일문자가 0번혹은1번발생 ( 파이프기호 ) or 연산자역할 () *+? *, +, 메타문자가괄호안의전체표현식에대해동작 Unix/Linux 20
명령열 (sequences) 조건부 / 무조건부건부실행순서 ( 무조건부 ) 명령열 (sequence) 세미콜론 (;) 으로구성됨, 순차적으로수행 ( 예 ) $ date > date.txt ; ls ; pwd > pwd.txt 프로세스의종료값반환 0( 성공적완성 ), 0 아닌값 ( 수행실패 ) Bourne shell과 Korn shell 프로세스의종료값표시 : $? [p153 참조 ] ( 예 ) $ date; echo $? 0 C shell 프로세스의종료값표시 : $status에 ( 예 ) % date; echo $status 0 셀을종료시키고부모프로세스에종료값전달 exit number ( 예 ) $ exit 3 ( 조건부 ) 프로세스의종료값이용 && ( 이전명령의종료값이 0이면, 다음명령계속수행 ) ( 이전명령의종료값이 0이아니면, 다음명령계속수행 ) ( 예 ) $ gcc myprog.c && a.out ( 예 ) $ gcc myprog.c echo compilation failed Unix/Linux 21
명령어그룹 Subshell( 자식셸 ) 명령어그룹수행시, 부모셸이자식셸을생성 ( 예 ) $ (date ; ls ; pwd) > output.txt cf. date ; ls ; pwd > output.txt 스크립트가가실행될때, 부모셸이자식셸을생성 후면작업이실행될때, 부모셸이자식셸을생성함 자식셸은부모셸로부터환경공간과지역변수공간의복사본을상 속받음 Unix/Linux 22
후면처리 (Background Processing) 후면프로세서의리다이렉션 & 자식셸로생성되어부모셸과같이수행되나키보드를제어하지않음 ( 예 ) % find. -name b.c -print & [p314 참조 ] (cf.) find. -name b.c -print %date ( 예 ) % date & pwd & Bourne, Bash 셸의후면처리의출력리다이렉션 ( 예 ) % find / -name b.c -print > find.txt & ( 예 ) % find / -name b.c -print > find.txt 2>&1 & ( 에러메시지도함께 ) ( 예 ) % find / -name b.c -print > find.txt 2> err.txt ( 따로따로 ) C 셸의후면처리의출력리다이렉션 ( 예 )%fi find / -name b.c -print > find.txt t & ( 예 ) % find / -name b.c -print >& find.txt & ( 에러메시지도함께 ) ( 예 ) % (find / -name b.c -print > find.txt) >& err.txt ( 따로따로 ) C 셸의후면처리의출력파이핑 ( 예 ) % find / -name b.c -print mail mysung & ( 예 ) % find / -name b.c -print & mail mysung & ( 에러메시지도함께 ) 후면처리의입력리다이렉션 키보드입력시에러시그널을내고종료됨 ( 예 ) % mail mysung &... 중단됨 ( 종료 ) Unix/Linux 23
셸프로그램 : Scripts 서브셸 (Subshell) Shell Script( 프로그램 ) 를작성할수있도록해줌 Script 셀명령들을포함하는화일로서, chmod +x 가적용되어야함 셸선택 (script 의첫줄에명시 ) 첫줄이 # : 스크립트를수행한셸 ( 현재셸 ) 에의해해석 #! shell 의 path ( 예 ) #! /bin/bash : 해당셸 위의두경우가아니면 : Bourne 셸 : 에의해해석 ( 로그인셸이 Bash 셸인경우에는 Bash 셸로해석 ) 3.16 서브셸 (Subshell) 3.11 명령열참조 Unix/Linux 24
변수 환경변수와지역변수 공통적인환경변수공통적인지역변수 이름의미이름의미 $HOME 홈디렉토리의절대경로이름 $LOGNAME 사용자 id $PATH 명령어탐색디렉토리목록 $SHELL 로그인의셀의절대경로이름 $MAIL mailbox 의절대경로이름 $TERM 터미널의유형 ( 예 ) echo LOGNAME = $LOGNAME, SHELL = $SHELL, TERM = $TERM Unix/Linux 25
변수 공통적인지역변수 이름의미이름의미 $$ 셀의프로세스 id $1..$n 명령어 n 번째인수 $0 $* 셀스크립트이름 명령어모든인수목록 ( 예 )$ cat script.sh ( 또는 script.csh 모든종류의셸에서정상동작 ) date > $1.$$ echo $1.$$ $ script.sh Sung Mee Young Sung.1234 $ cat Sung.1234 Unix/Linux 26
인용 (Quoting) HERE DOCUMENTS 셸의대표문자대치, 변수대치, 명령대치등을금지할때단일인용부호 (') 사용 셸의대표문자대치만을금지할때이중인용부호 (") () 사용 인용부호가중첩되어있는경우, 바깥쪽의인용부호만이효력을가짐 ( 예 ) $ echo 3 * 4 = 12 3 file1 file2 file3 4 = 12 ( 예 ) $ echo "3 * 4 = 12" 3 * 4 = 12 ( 예 ) $ name=mysung ( 본셸 )» C shell 에서는 # set name=mysung $ echo "My name is $name" My name is mysung $ echo 'My name is $name' My name is $name 3.19 HERE DOCUMENTS 3.7 리다이렉션참조 Unix/Linux 27
프로세스상태 : ps ps [aefglu] 작업제어 -a all ( 단말기에서제어하는 ) -e everything ( 단말기에서제어하지않는것도 ) -f full listing -g group -l long -u user ( 예 ) $ ps -ef UID PID PPID C STIME TTY TIME CMD root 0 0 0 5월 09? 0:01 sched root 1 0 0 5월 09? 0:19 /etc/init - root 2 0 0 5 월 09? 0:00 pageout root 3 0 1 5월 09? 6:31 fsflush root 305 1 0 5월 09 console 0:00 /usr/lib/saf/ttymon -g - h -p marvel console login: -T Tsun -d /dev/console -l lc mysung 24058 24056 0 14:01:31 pts/5 0:00 /bin/csh Unix/Linux 28
작업제어 ps 헤더 (header) F: flags( 현재는별의미없음 ) S: state(o: tt(orunning, S: sleeping, R: runnable, Z: zombie, T: stopped) UID: user ID PID: process ID PPID: parent ID C: central processor utilization STIME: starting time(24 시간지나면월일로 ) TTY: terminal 번호 TIME: 실행된분과초 CMD: command Unix/Linux 29
작업제어 프로세스살려두기 ( 지금은사라짐 ) nohup command» command 실행, HUP(Hangup) 과 TERM(Terminate) 시그널을무시» command의표준출력과에러는 nohup.out으로자동 redirection됨» 프로세스의우선순위를 5 감소» 로그인셀을빠져나올때후면프로세스들이종료되지않음» Linux 와 Solaris 10 의후면처리는암시적으로 nohup ( 예 ) Solaris 9 Borne shell 에서확인 $ nohup sleep 10000 & ($ sleep 10000 & 으로도확인 ) $ ps $ ^D login: $ ps ef grep mysung 프로세스잠재우기 [p146 참조 ] sleep seconds ( 예 ) $ (sleep 10; echo done) & Unix/Linux 30
작업제어 프로세스에에시스널보내기 : kill kill -signalid {pid}+ signalid : 프로세스에보내지는시그널의번호또는이름 (default: 15 = TERM) kill -l 적법한시그널이름의목록을보여준다 (signal #1 #31) [p565 참조 ] kill 0 현재의셀과관련된모든프로세스를종료시킴 ( 예 )$kill -KILL 27490 자식프로세스를기다림 : wait wait [pid] 명시된자식프로세스가종료될때까지해당셀이일시정지명시된 pid가없으면모든자식프로세스가종료되기를기다림 ( 예 ) $ (sleep 30; echo done 1) & 24193 $ (sleep 30; echo done 2) & 24195 $ echo done 3; wait; echo done 4 결과는? Unix/Linux 31
( 본셸프 ) 변수 변수의생성및할당 ( = 전후에빈칸없게 ) {name=value}+ 변수가존재하면새로운값으로바꾸고, 존재하지않으면자동적으로만들어짐. 공백은 로. ( 예 ) $ name=meeyoung age=20 $ echo $name is $age meeyoung is 20 $ name=meeyoung Sung... error 문자열은따옴표 ( ) 로표시 $ name= MeeYoung Sung Unix 시스템 32
( 본셸프 ) 변수 변수로의접근 $name : name의값으로대치 ${name} : name의값으로대치. 변수이름의일부로번역되는문자가숫자가표현식다음에올때유용 ( 예 ) $ verb=sing... 변수할당 $ echo I like $verbing... verbing 변수는없다 I like $ echo I like ${verb}ing... 성공 I like singing $ echo I like re${verb}ing... 성공 Unix 시스템 33
43 4.3 ( 본셸프변수 ) 변수 변수로의접근 ${name-word} : 설정되었으면 name 의값으로대치, 그렇지않으면 word 의값으로대치 ${name+word} : name 이설정되었을때 word 만대치 ( 예 ) $ startdate=${startdate-`date`} $ echo $startdate... 설정된값보기 Tue Feb 4 06:51 CST 1998 $ flag=1... 변수할당 $ echo ${flag+ flag is set }... 조건부메시지 #1 flag is set $echo${flag2+ flag2 g isset }... 조건부메시지 #2 Unix 시스템 34
43 4.3 ( 본셸프변수 ) 변수 변수로의접근 ${name=word} : name이설정되지않았으면 word를할당하고 name의값으로대치 ${name?word} : name이설정되지않았으면 word는표준에러채널로표시되고그셸은종료. ( 예 ) $ echo x=${x=10}... 디폴트값할당 x=10 $ value=${x? x not set }... 접근성공 $ echo $value... 값보기 10 $ value=${grandtotal? grand total not set }... 미설정 grandtotal : grand total not set $ grandtotal=100 $ value=${grandtotal? grand total not set } 설정 Unix 시스템 35
( 본셸프 ) 변수읽기 표준입력으로부터변수읽기 read {variable}+ ( 예 ) $ cat read.sh echo enter your name, age : \c read name age echo your name is $name echo your age is $age $ read.sh enter your name, age : meeyoung 20 your name is meeyoung your age is 20 Unix 시스템 36
( 본셸프 ) 제어구조 trap trap 번호가붙여진 signal을받을때마다셸에게 command 를실행하도록지시. 여러개의 signal이받아들여지면번호순으로 trap됨 ($ kill l 로 signal 확인 ) signal 번호 0 이지정되면, 셸이종료 (exit) 됐을때 command 가실행됨 [ 신호는참고서적 p565 참조 ] 단 SIGKILL(9) 과 SIGSTOP(23) 은 trap 할수없음 ( 예 ) $ cat trap.sh trap echo Control-C; C exit 1 2 while : do echo infinite loop sleep 2 done trap [[ [ command d]{ signal l} + ] # 2(interrupt) 신호가수신되면 로둘러싸인명령어가실행됨 # 3(quit; Control-\) 또는 23(stop; Control-Z) 테스트 Unix 시스템 37
( 본셸프 ) 제어구조 case-in-esac ( 예 ) $ more menu.sh #! /bin/sh echo menu test program stop=0 while test $stop -eq 0 do cat << ENDOFMENU 1 : print the date. 2,3 : print the current working directory. 4 : exit ENDOFMENU # ENDOFMENU 앞에빈칸없게 echo echo 'your choice? \c' read reply echo case $reply in "1") date ;; "2" "3") pwd ;; "4") stop=1 ;; *) # default. echo illegal choice # error. ;; esac done Unix 시스템 38
46 4.6 ( 본셸프제어구조 ) 제어구조 for ( 예 ) $ cat for.sh... 스크립트내용표시 for color in red yellow green blue do echo one color is $color done $ for.sh... 스크립트실행 one color is red one color is yellow one color is green one color is blue Unix 시스템 39
( 본셸프 46 4.6 제어구조 ) 제어구조 if-then-fi fi $ cat if.sh echo -n enter a number : read number if [ $number -lt 0 ] then echo negative..$number < 0 이면음수 elif [ $number -eq 0 ] then echo zero.. $number = 0 이면 0 else echo positive fi $ if.sh... 스크립트실행 enter a number : l positive $ if.sh... 스크립트다시실행 enter a number : -l negative Unix 시스템 40
( 본셸프 46 4.6 ) 제어구조 until-do-done d ( 예 ) $ cat until.sh x=1 until [ $x -gt 3 ]...$x가 3보다크면참 do echo x = $x x=`expr $x + 1` done $ until.sh x = 1 x = 2 x = 3 Unix 시스템 41
( 본셸프 46 4.6 ) 제어구조 while-done ( 예 ) $ cat while.sh x=1 while [ $x -le 3 ]...$x가 3보다작으면참 do echo x = $x x=`expr $x + 1` done $ while.sh x = 1 x=2 x = 3 Unix 시스템 42
( 참고 ) 본셸프로그램 1 문제 1: 다음은 3 초마다한번씩 stu 가로그인했는지조사하는본셸프로그램 watchfor이다. 이프로그램을참조하여매개변수로입력된사람이로그인했는지조사하되한사람이상도매개변수로입력하여조사할수있도록수정하라. ( 예, $ watchfor 'mysung root stu') $ cat watchfor #!/bin/sh until who grep stu do sleep 3 done Unix 시스템 43
( 참고 ) 본셸프로그램 2 문제 2: 다음의 pick ik 은매개변수로입력된인수들을취사선택하는본쉘프로그램이다. 이프로그램을코딩하여실행해보고, 명령줄에아무것도없으면표준입력으로부터인수를읽을수있도록프로그램을수정하라. 빈칸을적절히다루고, q 도잘동작하도록하라. $ cat pick #!/bin/sh for i do echo $i? \c read response case $response in y*) echo $i ;; q*) break esac done Unix 시스템 44
( 참고 ) 본셸프로그램 3 문제 3 : 다음의 checkmail 본쉘프로그램은명령줄매개변수로입력된값을주기로하여 ( 단, 매개변수입력이없으면 6초로지정 ) 반복적으로전자우편함의크기를조사하여메일이왔는지를알려주는프로그램이다. 이프로그램을코딩하여실행해보고메시지에메일을보낸사람의이름이나타나도록하고우편함파일 (MAIL) 이존재하지않더라도잘동작하도록수정하라. $ cat checkmail #! /bin/sh MAIL=/var/mail/`logname` t=${1-6} x= `ls -l l$mail` while : do y= `ls -l $MAIL` echo $x $y x= $y sleep $t done awk $5 < $14 {print You have mail } Unix 시스템 45
( 참고 ) junk.ksh kk & junk.bash kb #! /bin/ksh # junk script # Lorn shell version # author: Graham Glass # 9/25/91 # Initialize variables filecount=0 # the number of files specified. listflag=0 # set to 1 if the list option (-) is used. purgeflag=0 g # set to 1 if the purge (-p) option is used. fileflag=0 # set to 1 if at least one file is specified. junk=~/.junk # the name of the junk directory. error () { # Display error message and quit cat << ENDOFTEXT echo Dear $USER, the usage of junk is as follows: echo junk -p means "purge all files" echo junk -l means "list junked files" echo junk <list of files> to junk them ENDOFTEXT exit 1 } # Parse command line for arg in $* do case $arg in "-p") purgeflag=1 ;; "-l") listflag=1 ;; "-*") echo $arg is an illegal option ;; *) fileflag=1 # Check for too many options let total=$listflag+$purgeflag+$fileflag if (( total!= 1 )) then error fi # If junk directory doesn't exist, create it if [[! (-d $junk) ]] then 'mkdir' $junk # "mkdir $junk"is OK fi # Process options if (( listflag == 1 )) then 'ls' -lgf $junk exit 0 Fi if (( purgeflag == 1 )) then 'rm' $junk/* exit 0 fi if ((fileflag == 1 )) then 'mv' ${filelist[*]} $junk # move files to junk directory. exit 0 fi exit 0 filelist[$filecount]=$arg # append to list let filecount=filecount+1 ;; esac done Unix 시스템 46
과제 2 10 월 12 일까지 1. quiz1(vi) 풀이제출하세요 2. 아래문제풀이제출하세요 1 한줄이넘는긴명령들을어떻게입력할수있는가? 2 내장명령어와유틸리티사이의차이점은무엇인가? 3 실행가능한스크립트를어떻게만들수있는가? 4 좋은umask 값은무엇인가? 그리고그이유는? 5 다음과정에서생성된파일이 umask 값에의해영향을받지않는이유는무엇인가? 1 $ ls -l date.txt 2 -rw-rw-rw- 1 mysung other 0 9월 25일 09:25 xx 3 $ umask 0077 4 $ date > date.txt 5 $ ls l date.txt 6 -rw-rw-rw- 1 mysung other 0 9월 25일 09:25 xx 6 현재의날짜 (date), 사용자자신의이름그리고사용자자신의로그인셸을출력하는스크립트를작성하라. 7 a.sh, b.sh, 그리고 c.sh 라불리는일련의세가지셸스트립트를작성하여 exec 명령을실습하라. 각셀스크립트는자신의이름을보여주고, ps를수행하고, 그런다음 exec를이용하여다음스크립트를실행시켜보라 ( 즉, a.sh 은 b.sh 을, b.sh 은 c.sh 을실행 ). 처음스크립트를 exec a.sh로실행시켰을때 어떤일이생기는지관찰하라. 8 3개의후면처리프로세스를생성하고, 세프로세스가모두완수될때까지기다린후, 간단한메시지를표시하는스크립트를작성하라. 9 ls > ls.out 명령을수행한후 ls.out 파일의내용안에왜자기자신인 ls.out 파일이들어있는지를설명하라. 10 다음 2 개의명령을비교하여설명하라. $ who sort $ who > sort Unix/Linux 47
1. Electrical Version 1 과제제출방법 csmail.incheon.ac.kr (117.16.244.56) 의 /home/2009hw/2009ula 또는 2009ulb에자기학번으로숙제방 ( 디렉토리 ) 만들고그안에복사 자신의디렉토리보호권장 : chmod 1700 directoryname 2. Electrical Version 2 multi.incheon.ac.kr (117.16.244.57의 /export/home/2009hw/2009ula 또는 2009ulb에자신의학번으로숙제방 ( 디렉토리 ) 만들고그안에복사 자신의디렉토리보호권장 : chmod 1700 directoryname Unix/Linux 48