Download presentation
Presentation is loading. Please wait.
Published byĐào Thu Modified 5년 전
1
6. C 셸 한글 전환: Ctrl + Space 해보세요! 이것도 좀 해보세요. cal, bc, hostname, whoami
% >xx echo hello % > xx cat echo ^G^G^G …stty 참조 date^M (carriage return) …stty 참조 date^J (line feed, new line) …stty 참조
2
6.1 소개 6.2 시작하기 Shell의 공통적인 기능 이외에 C Shell에 추가된 기능들
변수를 설정하고 접근하는 여러 가지 방법 조건 분기, 루프, 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선 6.2 시작하기 /bin/csh 시작순서 ① $HOME/.cshrc ② /etc/.login ③ $HOME/.login .cshrc (run commands): 자주 쓰이는 별명을 설정함 .login : $TERM, $PROMPT, $PATH 등의 변수 값을 설정함 (예) .cshrc (예) .login Unix 시스템
3
6.3 변수 ① 지역 변수(단순 변수, 리스트 변수) ② 환경 변수 단순 변수의 값 할당 단순 변수로의 접근
set {name [= word]}* (예) % set 모든 지역 변수의 리스트가 나타남 % set name = M.Y. Sung % set name = "M.Y. Sung" % echo $name 단순 변수로의 접근 $name 변수 name의 값 (독립 사용할 때) ${name} 변수 name의 값 (접속 사용할 때) ${?name} 변수 name의 설정되어 있으면 1, 아니면 0의 값 Unix 시스템
4
6.3 변수 리스트 변수의 값 할당 (예) % set colors = ( red yellow green )
(예) % set verb = sing % echo I like $verbing verbing: undefined variable % echo I like ${verb}ing I like singing (예) % cat flag.csh # set flag flag를 null 문자로 설정함 if (${?flag}) then echo flag is set endif % flag.csh flag is set 리스트 변수의 값 할당 set {name = ( {word}* ) }* (예) % set colors = ( red yellow green ) % echo $colors red yellow green Unix 시스템
5
6.3 변수 리스트 변수로의 접근 ① $name[selector] 리스트 변수 name의 값 (독립 사용할 때)
(예) $#argv : 입력라인 매개변수의 개수 ④ ${#name} (접속 사용할 때) Unix 시스템
6
6.3 변수 cf. selector: start-end 형태, start가 명시 안되면 1로 간주, *는 모든 범위
(예)% set colors = ( red yellow green ) % echo $colors[1] red % echo $colors[2-3] yellow green % echo $colors[4] Subscript out of range % echo $#colors 3 리스트 변수의 추가 원래의 리스트에 원소를 더하고, 이들을 괄호로 묶어 원래 변수로 치환 (예) %set colors = ( red yellow green ) %set colors[4] = pink Subscript out of range %set colors = ( $colors blue ) %echo $colors red yellow green blue Unix 시스템
7
6.3 변수 C shell에 미리 정의된 여러 지역/환경 변수들 (예) % cat var5.csh [교재 p249]
$? $< $argv $cdpath $cwd $echo $home $history $histchars $mail $noglob $notify $path $prompt $shell $status $time $verbose $savehist $noclobber $nonomatch $ignoreeof (예) % cat var5.csh [교재 p249] echo -n "please enter your name: " set name = $< # take a line of input echo hi $name, your current directory is $cwd Unix 시스템
8
6.3 변수 환경 변수의 값 할당 (예)% setenv TERM vt100 % echo $TERM 미리 정의된 환경 변수
setenv name word (예)% setenv TERM vt100 % echo $TERM 미리 정의된 환경 변수 ① 공통적으로 미리 정의된 환경 변수 $HOME $PATH $MAIL $USER $SHELL $TERM ② C shell 특유의 환경 변수 $LOGNAME (셀 소유자의 사용자 id) Unix 시스템
9
6.4 연산식 C shell의 연산식 ① 문자열 연산식 문자열 연산식 의 미 연산자 == != =~ !~ 같으면 참
① 문자열 연산식 ② 산술 연산식 ③ 화일 지향적 연산식 문자열 연산식 의 미 연산자 == != =~ !~ 같으면 참 같지 않으면 참 ==와 동일. 단, 오른쪽에 대표문자 포함 !=와 동일. Unix 시스템
10
6.4 연산식 (예)% cat expr1.csh [교재 p251] echo -n "do you like C shell?
set reply = $< if ($reply == "yes") then echo you entered yes else if ( $reply =~ y* ) then echo I assume you mean yes endif Unix 시스템
11
6.4 연산식 산술 연산식 (C-like) 의 미 연산자 - ! * / % + - << >>
의 미 연산자 - ! * / % + - << >> unary 음수 논리적부정 곱셈,나눗셈,나머지 덧셈, 뺄셈 Bitwise shift <= >= < > 관계 연산 == != 같다, 같지 않다 & ^ | Bitwise and,xor,or && || logical and, or Unix 시스템
12
6.4 연산식 (예) % cat expr3.csh # set a = 3 set b = 5
if ($a > 2 && $b > 4) then echo expression evaluation seems to work endif Unix 시스템
13
6.4 연산식 연산식의 결과를 변수에 할당하기 위해서는 set 명령을 사용하지 않는다. (반드시 공백으로 분리) @
모든 셸 변수들을 표시 @variable op expression 변수 variable에 expression의 결과 할당 @variable[index] op expression variable의 index 번째에 할당 (예) % set a = 2 * set: Syntax error. a = 2 * 2 % echo $a 4 a = $a + $a b = ( $a && $flag ) && 때문에 괄호 필요 % set value = 1 value ++ 혹은 -- 연산 가능 Unix 시스템
14
6.4 연산식 화일 지향적 연산식 -option "fileName" 만일 옵션이 참이면 1을, 아니면 0을 반환 의 미
의 미 옵 션 r w x e o z f d 셸은 fileName에 대해 읽기 허가를 갖는다. 쓰기 허가를 갖는다. 실행 허가를 갖는다. fileName이 존재한다. 셸 프로그램와 fileName의 소유자가 동일하다. fileName이 존재하고 크기 가 0이다. fileName은 정규화일이다. fileName은 디렉토리이다. Unix 시스템
15
6.4 연산식 (예) % cat expr4.csh # echo -n "enter the name of the fiie you wish to erase: " set filename = $< if ( ! (-w "$filename") ) then echo you do not have permission to erase that file. else rm $filename echo file erased endif Unix 시스템
16
6.5 별명(Aliases) (예)% alias 현재의 별명들의 목록을 보여 줌 자신만의 고유한 명령어를 만들어 사용한다
alias [word [string] ] (예)% alias 현재의 별명들의 목록을 보여 줌 (예) % alias word word가 어떤 string의 별명인지를 보여줌 (예) % alias dir 'ls -aF’ % alias ls 'ls -aF' (예)% alias who 'date; who' who에 대한 무한루프 발생(error) % alias who 'date; /bin/who' who의 절대경로 사용 해결 unalias pattern pattern과 일치하는 별명을 제거한다. 만일 pattern에 *가 사용되면 모든 별명을 제거한다. Unix 시스템
17
6.5 별명(Aliases) 유용한 별명 (.cshrc에 저장)
% alias cd 'cd \!*; set prompt="$cwd\!>"; ls 지정된 디렉토리로 이동하고, prompt를 현재의 디렉토리와 마지막 명령 번호를 포함하도록 한 후, 현재의 목록을 보여줌 \!* (두 번째부터 마지막번째까지의 토큰 즉 모든 인수들) \! (마지막 명령어의 번호) % alias ls 'ls -F' 화일과 디렉토리에 관한 추가 정보 보이기 % alias rm 'rm -i' 지울지 말지 확인을 먼저한다. % alias rm 'mv \!* ~/tomb' 지울 대상을 tomb 디레토리 밑으로 옮김 % alias h 'history' 히스토리 정보 얻기 % alias vi 'mesg n; /bin/vi \!*; mesg y' vi 편집 기간동안 타인으로부터의 메시지 전달 방해 억제 % alias moer 'more' 일어나기 쉬운 오타 방지 % alias ls-l 'ls -l' 일어나기 쉬운 오타 방지 % alias ll 'ls -l’ 상세한 목록 정보 얻기 Unix 시스템
18
6.6 히스토리 키보드로부터 받은 명령어들을 순서대로 기억해 둠 번호가 붙여진 명령어 관련환경 변수
효과적인 사용을 위해, prompt에 명령어의 번호가 붙음 % set prompt = ’\! %’ % echo hello 관련환경 변수 $history 히스토리 목록의 크기, default = 1 $savehist 히스토리 화일($HOME/.history) 에 저장되는 명령 어의 수 세션 간에 명령어 접근을 허용하는 능력 (cf) .history 화일은 같은 사용자에 의하여 생성된 모든 대화형 C shell에 의하여 공유된다. (예)$ % set history 마지막 40개의 명령어를 기억하도록 함 (예)$ % set savehist 32 세션들 사이에 32개의 명령어를 저장함 Unix 시스템
19
6.6 히스토리 히스토리 읽기 명령어의 재실행 history [-rh] [number]
재실행된 명령어 텍스트는 echo된 후 실행된다 ① !! 마지막 명령의 텍스트로 치환된다 ② !number 명시된 사건 번호를 갖는 명령의 텍스트로 치환된다 ③ !prefix prefix로 시작되는 마지막 명령의 텍스트로 치환된다 ④ !?substring? substring을 포함하는 마지막 명령의 텍스트로 치환 (예) % !41 41번째 명령어를 실행함 Unix 시스템
20
6.6 히스토리 히스토리 수정자(modifier) 사건 명시자 바로 뒤에 나와서 이전 명령의 일부에 접근
① : 첫 번째 토큰 ② :number (number+1)번째 토큰 ③ :start-end (start+1)부터 (end+1)번째 토큰 ④ :^ 첫 번째 토큰 (:은 생략 가능) ⑤ :$ 마지막 번째 토큰 (:은 생략 가능) :* 두 번째부터 마지막번째 토큰 (:은 생략 가능) (예)48 % echo I like horseback riding I like horseback riding 49 % !!:0 !!:1 !!:2 !!:4 echo I like riding I like riding 50 % echo !48:1-$ echo I like horseback riding Unix 시스템
21
6.6 히스토리 화일 수정자 대치 수정자 !event:s/pattern1/pattern2/
기존의 히스토리 수정자에 덧붙여 화일 이름의 특정한 부분을 접근함 ① :h 화일의 바로 앞 부분 ② :r 화일의 루트 부분 ③ :e 화일의 확장자 부분 ④ :t 화일의 뒤 부분 (예) 53 % ls /usr/include/stdio.h /usr/include/stdio.h 54 % echo !53:1:h /usr/inlcude 55 % echo !53:1:r /usr/inlcude/stdio 56 % echo !53:1:e h 57 % echo !53:1:t stdio.h 대치 수정자 텍스트가 대치된 후 재실행됨 !event:s/pattern1/pattern2/ (예)58 % ls /usr/include/stdio.h /usr/include/stdio.h 58 % !58:0 !58:1:s/stdio/signal/ /usr/include/signal.h Unix 시스템
22
6.7 제어구조 C-like foreach-end foreach name ( wordlist ) commandlist end
명령어 목록이 반복 실행됨, 반복할 때마다 해당 변수가 다른 값을 가짐 (예)% cat foreach.csh # foreach color (red yellow green blue) echo one color is $color end % foreach.csh one color is red one color is yellow one color is green one color is blue foreach name ( wordlist ) commandlist end Unix 시스템
23
6.7 제어구조 goto ……… label : 무조건 분기 goto label (예) % cat goto.csh
# echo gotta jump! goto endOFScript echo I'll never echo this endOFScript: echo the end % goto.csh gotta jump! the end Unix 시스템
24
6.7 제어구조 if ( expr) command if ( expr1) then commandlist1
if-then-else-endif if ( expr) command if ( expr1) then commandlist1 else if ( expr2 ) then commandlist2 else commandlist3 endif Unix 시스템
25
6.7 제어구조 (예) % cat if.csh # echo -n 'enter a number: ' # prompt user.
set number = $< if ($number < 0) then echo negative else if ($number == 0) then echo zero else echo positive endif % if.csh enter a number: -1 negative Unix 시스템
26
6.7 제어구조 Onintr onintr [ - | label ] - 인터럽트 무시 label label로 분기
키보드로부터 ^C (interrupt, SIGINT) 값을 받았을 때 분기하도록 지시 onintr [ - | label ] - 인터럽트 무시 label label로 분기 (예) % cat onintr.csh # onintr controlC while (1) echo infinite loop sleep 2 end controlC: echo control C detected % onintr.csh infinite loop ^C control C detected Unix 시스템
27
6.7 제어구조 repeat repeat expr command while-end while ( expr )
단일 명령어를 지정된 시간의 수만큼 반복 수행한다 (예) % repeat 2 echo hi there 2개의 줄 표시 hi there while-end 참인 동안 명령어를 반복 수행함 repeat expr command while ( expr ) commandlist end (cf.) break continue Unix 시스템
28
6.7 제어구조 (예) % cat multi.csh # set x = 1 # set outer loop value
while ($x <= 7) # outer loop set y = # set inner loop value while ($y <= 7) # inner loop @ v = $x * $y # calculate entry echo -n $v " " # display entry @ y # update inner loop counter end echo "" # newline @ x # update outer loop counter % multi.csh 7 Unix 시스템
29
6.7 제어구조 switch-case-endsw switch (expr) case pattern1 : commandlist1
다중 분기 지원 switch (expr) case pattern1 : commandlist1 breaksw case pattern2 : case pattern3 : commandlist2 default : endsw Unix 시스템
30
6.7 제어구조 (예) cat menu.csh # echo menu test program set stop=0
while ( $stop == 0 ) cat << ENDOFMENU 1 : print the date. 2, 3 : print the current working directory 4 : exit ENDOFMENU echo echo -n 'your choice? ' set reply = $< echo "" switch ($reply) case "1": date breaksw case "2": case "3": pwd case "4": set stop = 1 default: echo illegal choice endsw end Unix 시스템
31
6.7 제어구조 예제 : JUNK junk -lp {fileName}* 지정된 화일을 지우는 rm 대신 사용하는 명령으로,
화일을 지우지 않고 $HOME/.junk에 이동시킨다. -l $HOME/.junk의 내용을 보여준다(list). -p $HOME/.junk을 제거한다(purge). 만일 .junk 디렉토리가 없으면 자동으로 생성해 준다. Unix 시스템
32
6.7 제어구조 (예) % cat junk.csh #! /bin/csh # junk script
# author: Graham Glass # # Initialize variables set fileList = () set listFlag = 0 set purgeFlag = 0 set fileFlag = 0 set junk = ~/.junk # Parse command line foreach arg ($*) switch ($arg) case "-p": set purgeFlag = 1 breaksw case "-l": set listFlag = 1 case -*: each $arg is an illegal option goto error breaksw default: set fileFlag = 1 set fileList = ($fileList $arg) endsw end # # Check for too many options @ total = $listFlag + $purgeFlag + $fileFlag if ($total != 1) goto error # If junk directory doesn't exist, create it if (!(-e $junk)) then 'mkdir' $junk endif Unix 시스템
33
6.7 제어구조 # # Process options if ($listFlag) then 'ls' -lgF $junk
exit 0 endif if ($purgeFlag) then 'rm' $junk/* if ($fileFlag) then 'mv' $fileList $junk # # Display error message and quit error: cat << ENDOFTEXT Dear $USER, the usage of junk is as follows: junk -p means "purge all files" junk -l means "list junked files" junk <list of files> to junk them ENDOFTEXT exit 1 Unix 시스템
34
6.9 개선점 명령어 재실행을 위한 최적 방법 메타문자 { } 화일 이름 대치 ^ pattern1^pattern2
(예) % cc fil.txt → Can't open file fil.txt % ^fil^file → cc file.txt 메타문자 { } a{b,c}d → abd acd(접두사, 접미사의 입력시간 감소) (예) % cp /usr/include/{stdio,signal}.h . → 두 파일을 복사 화일 이름 대치 ① 화일 이름 대치 금지: 변수 $noglob 설정 (default: 비설정) ② 패턴 불일치시 에러 보고 금지: 변수 $nonomatch 설정 (default: 비설정) → Refer to ‘set’, ‘unset’ Unix 시스템
35
6.9 개선점 (예) % echo p* prog1.c prog2.c % set noglob → 대표문자 처리 금지
(예) % echo *a echo: No match. % set nonomatch → 에러 발생하지않고 원래 패턴 인쇄 % echo *a *a Unix 시스템
36
6.9 개선점 redirection ① 표준 에러 채널을 리다이렉션: >& 또는 >>&
② 예상 외의 덮어씌우기로부터 화일 보호: $noclobber 설정 (default: 비설정) (예) % (process1 > file1) >& file2 →표준 출력은 file1으로 표준 에러는 file2로 저장함 (예) % set noclobber % cc a.c >& errors errors: File exists. 표준출력 뿐 아니라 표준에러도 pipe시킴 |& (예) % cc a.c |& more (예)% (cc a.c > file1) |& more cc a.c의 표준 출력은 file1으로 저장하고, 명령어 그룹의 출력과 에러 채널을 more로 파이프 처리함 Unix 시스템
37
6.9 개선점 작업 제어를 위한 추가적 내장명령어 제공 ① stop {%job}* 지정된 작업을 중단한다.
%integer 작업번호가 integer인 작업 %prefix prefix로 이름이 시작하는 작업 %+ 마지막으로 참조된 작업 (default) %% %+와 동일 %- 마지막에서 두 번째로 참조된 작업 (예) % stop %man % stop %1 ② suspend su나 script 등으로 불러들인 shell을 중단시킴 Unix 시스템
38
6.9 개선점 ③ nice [+/- number] [command]]
command의 우선순위를 number로 설정한다. (적당한 때 수행) 우선순위 number가 높을수록 실행은 더 늦다. 슈퍼유저 만이 음수의 우선순위를 설정할 수 있다. 우선순위가 생략되면 4로 간주한다. command가 명시되지 않으면 현재의 shell에 대한 것으로 간주 ④ nohup command command를 수행하고 모든 방해조건 으로부터 보호한다 command가 명시되어 있지 않으면 해당 셀의 모든 명령어가 됨 backgounding command도 해당됨에 주의 ⑤ notify {%job}* 지정된 작업이 상태를 바꿀 때 즉시 통보 하도록 한다. 모든 작업에 대해서 할 때는, $notify를 설정한다. Unix 시스템
39
6.9 개선점 C shell 종료시에, 2개의 끝내기 화일을 탐색 ⑥ 로그인 셀의 다양한 종료 방법
㈀ logout : login shell만을 종료 ㈁ exit : login shell 및 interactive shell의 종료 ㈂ control-D : 입력 종료 ($ignoreeof이 설정되면 무력해짐) (예) % set ignoreeof % ^D use "logout" to logout % logout C shell 종료시에, 2개의 끝내기 화일을 탐색 ㈀ $HOME/.logout ㈁ /etc/logout (cf.) 끝내기 화일의 주요 내용 임시 디렉토리 지우기, 종료 메시지등 Unix 시스템
40
6.10 추가 내장 명령어 chdir [path] glob {arg} source [-h] fileName cd와 동일
cho와 비슷하나, 마지막 출력에 공백대신 널(ASCII 0)로 arg 목록을 구분하는 것이 echo와 다름 source [-h] fileName 스크립트가 실행될 대 서브셀로 번역된다. 따라서 원래의 셀에는 아무런 영향을 미치지 못한다. 스크립트를 현재의 셀에의해 번역 실행하여 영향을 주고자 할 때 이 source를 사용한다. -h 스크립트 fileName 안에 있는 명령어들이 단지 히스토리 리스트에 놓임 fileName 스크립트 수행시 발생한 에러는 원래의 셀로 반환된다 (예)% source .login → .login화일을 재실행 (서브셀을 부르지않음) Unix 시스템
41
6.11 디렉토리 스택 pushd [ +number | name ] popd [ +number ]
명시된 디렉토리를 디렉토리 스택에 추가시킴 ① name이 주어지면, 현재 작업 디렉토리는 스택에 삽입되고, 셀은 주어진 이름의 디렉토리로 옮겨간다 ② -number가 주어지면, 스택의 number번째 원소는 스택의 탑으로 옮겨지고 현재의 작업 디렉토리가 된다. 스택의 원소는 탑을 0으로하여 오름차순으로 번호가 메겨져있다. ③ 인수가 주어지지 않으면, 스택 탑의 두 원소는 자리바꿈을 한다 popd [ +number ] 명시된 디렉토리를 디렉토리 스택에 삭제하고, ① -number가 주어지면, 셀은 스택의 number번째 디렉토리로 옮겨간다 ② 인수가 주어지지 않으면, 셀은 스택 탑의 디렉토리로 옮겨가고 그 디렉토리를 스택에서 삭제한다. Unix 시스템
42
6.11 디렉토리 스택 dirs 현재 디렉토리 스택의 내용을 보여 준다 hash table
(예) % pwd /usr/mysung % pushd / / ~ % pushd /usr/inlude /usr/include / ~ % pushd / /usr/include ~ % popd /usr/inlude ~ hash table C shell은 해시 테이블이라는 내부적 자료 구조를 유지하여 실행화일 탐색을 빠르게 함 ① $PATH가 바뀔 때마다 ② 새로운 실행화일이 $PATH 안의 어떤 디렉토리에 해시 테이블을 다시 작성한다. (예) % rehash → 해시 테이블을 다시 작성 (예) % hashstat → 해시 통계 자료 표시 Unix 시스템
43
6.12 명령줄 옵션 만일 명령 줄의 첫째 인수가 -라면, C shell은 login shell로 시작된다.
표준 입력으로부터 한 줄을 읽고 실행한다. 의 미 옵션 -c string -e -f string 명령을 실행하기 위하여 셀을 생성한다. 어떤 명령어가 0이 아닌 종료 코드를 반환하면, 셀은 종료된다. 셀은 시작하지만, .cshrc에서 명령을 읽지는 않는다. -t -v -V $verbose를 설정하게 한다. .cshrc이 실행되기 전에 $verbose를 설정하는 것을 제외하고는 -v와 같다. Unix 시스템
44
6.12 명령줄 옵션 의 미 옵션 의 미 -i -n -s 대화형 셀을 형성한다. 즉, SIGTERM, SIGINT, SIGQUIT 메시지를 모두 무시하는 것을 제외하고는 -s와 같다. 명령을 문법적으로 분석 하지만, 실행하지는 않는다. 단지 디버깅을 위한 것임 표준 입력으로부터 명령을 읽고 셀 메시지를 표준 에러 채널에 보내는 셀을 생성한다. -x -X fileName .cshrc가 읽혀지기 전에 $echo를 설정하는 것을 제외하고는 -x와 같다. 만일 -c, -i, -s, -t 옵션이 사용되지 않으면 fileName에 있는 셀 명령어들을 실행한다. fileName 스크립트 내에서 fuleName은 $0이다. $echo를 설정하게 한다. Unix 시스템
45
과제…10월 31일까지 중간 시험 풀이 : paper version only 교재 p 284 연습문제
연습문제 1. track C shell version 연습문제 2. hunt “C 셸 버전으로” 문제 [자료 p40-42] 문제1. watchfor 문제2. pick 문제3. checkmail 2, 3 과제 제출 방법 Electrical Version : multi.inchon.ac.kr ( )의 ~mysung/2000report/에 자신의 학번으로 디렉토리 만들고 그 안에 복사 Paper Version : 종이에 소스와 실행 과정 및 결과 출력하여 제출 Unix 시스템
46
C 셸 버전 1 문제 1: 다음은 60초 마다 한번씩 mary가 로그인 했는지 조사하는 본 셸 프로그램 watchfor이다. 이 프로그램을 참조하여 매개변수로 입력된 사람이 로그인 했는지 조사하는 C 셸 버전을 작성하되, 여러 사람도 살펴볼 수 있도록 하라. (p157 egrep 참조) $ cat mary PATH=/bin:/usr/bin until who | grep mary do sleep 60 done Unix 시스템
47
C 셸 버전 2 문제 2: 다음의 pick은 매개변수로 입력된 인수들을 취사선택하는 본 쉘 프로그램이다. 이 프로그램을 코딩하여 실행해 보고, 명령 줄에 아무것도 없으면 표준 입력으로부터 인수를 읽는 pick의 C 셸 버전을 작성하라. 빈 칸을 적절히 다루고, q 도 잘 동작하도록 하라. $ cat pick PATH=/bin:/usr/bin for i do echo “$i? \c” > /dev/tty read response case $response in y*) echo $i ;; q*) break esac done < /dev/tty Unix 시스템
48
C 셸 버전 3 문제 3 : 다음의 checkmail 본 쉘 프로그램을 코딩하여 실행해 보고 C 셸 버전으로 수정하되 메시지에 메일을 보낸 사람의 이름이 나타나도록 하고 우편함 파일(MAIL)이 존재하지 않더라도 잘 동작하도록 하라. $ cat checkmail PATH=/bin:/usr/bin MAIL=/var/mail/`logname` t=${1-60} x=“`ls -l $MAIL`” while : do y=“`ls -l $MAIL`” echo $x $y x = “$y” sleep $t done | awk ‘$5 < $14 {print “You have mail”}’ Unix 시스템
Similar presentations