관리 메뉴

드럼치는 프로그래머

[유닉스실습] 6장 C셸 junk 프로그램 실행 및 분석 본문

★─Multi Media/☆─3학년 1학기

[유닉스실습] 6장 C셸 junk 프로그램 실행 및 분석

드럼치는한동이 2008. 10. 13. 20:02


1. “junk" 예제 스크립트 실행

 



..“.junk" 디렉토리 내용 표시
 

..junk를 실행할 파일들 표시

..두 파일에 junk 실행

..“.junk" 디렉토리 내용 표시

..“.junk" 디렉토리 내 파일 제거

..".junk" 디렉토리 내용 표시

..없는 옵션을 시도함

..error 메시지 출력

(HERE DOCUMENT)

 

▶ TEST



첫 번째 Test에서 junk로 test1.csh 파일을 실행 후 junk -p test2.csh를 하게 되면 프로그램은 2개의 인자를 인식하여 명령인자가 2개가 됩니다.

그럼 첫 번재 인자 -p 옵션이 switch-case제어문에서 purgeFlag = 1을 실행 후 breaksw를 만나서 switch-case문이 끝나면서 purgeFlag가 1이 되고 다시 foreach문이 실행됩니다. (명령인자가 2개이기 때문에 2번 반복) 그리고 2번째 인자가 test2.csh이므로 default가 실행되고 fileFlag = 1 이 되고 fileList에 추가되면서 반복문이 끝이 납니다.


옵션처리에서 purgeFlag의 if조건제어문을 먼저 만나서 ".junk“ 디렉토리의 내용이 제거되고 exit 0을 만나서 스크립트가 종료됩니다.

그러므로 “.junk" 디렉토리 안에 파일은 사라집니다.

두 번째 Test에서 junk로 test3.csh 파일을 실행 후 junk menu.sh -p를 하게 되면 이 프로그램 역시 2개의 인자를 인식하여 명령인자가 2개가 됩니다.

첫 번째 인자는 -p, -l, -* 옵션이 아니므로 switch-case제어문에서 default문을 만나서 fileFlag = 1이 되고 fileList에 menu.sh가 추가됩니다.

두 번째 인자 -z 옵션으로 인해서 goto error문을 만나서 error에대한 HEAR DOCUMENT를 만나서 에러문을 출력하고 exit 1로 종료됩니다.

그러므로 “.junk” 디렉토리 안에 파일은 삭제되지 않고 남아있는 것입니다.


2. "junk" 예제 스크립트 소스

 

 



3. “junk” 예제 스크립트 분석


#!/bin/csh
# junk script
# 저자 : Graham Glass

# 9/25/91

#

# 변수의 초기화
#set fileList = ()       
# 모든 명시된 파일의 목록
set listFlag = 0       
# "-l" 옵션이 명시되면 1로 설정
set purgeFlag = 0       
# "-p" 옵션이 사용되면 1
set fileFlag = 0       
# 적어도 1 파일이 명시되면 1
set junk = ~/.junk       
# junk 디렉토리

#

# 명령줄 파싱
#
foreach arg ($*)
# 모든 명령 줄 인수의 목록들이 arg라는 단어리스트에 저장하고 인수 개수만큼 반복  

   
switch ($arg)                         # 해당 명령인자 $arg에 따라 case문 결정     
      case "-p":                          
# -p 옵션이라면 실행       
            set purgeFlag = 1         
# 변수 purgeFlag에 1을 대입       
            breaksw                       
# breaksw문으로 switch-case문 종료    
      case "-l":                            
# -l 옵션이라면 실행       
            set listFlag = 1              
# 변수 listFlag에 1을 대입       
            breaksw                       
# breaksw문으로 switch-case문 종료     
      case -*:                             
# -p, -l 옵션을 제외한 나머지가 입력된다면 실행     
            echo $arg is an illegal option       
# echo문으로 문장 출력       
            goto error                                     
# error라고 명명된 레이블로 점프
            breaksw                                        # breaksw문으로 switch-case문 종료
      default:                                                # 만약 파일의 이름이 입력된다면 실행
            set fileFlag = 1                               # 변수 fileFlag에 1을 대입
            set fileList = ($fileList $arg)            # 파일이름을 리스트에 추가 
            breaksw                                       
# breaksw문으로 switch-case문 종료
      endsw                                                 # swich-case 제어문 종료
end                                                           # foreach 제어문 종료
#
#
# 너무 옵션이 많은가 조사
#                                                               # 연산식의 결과는 내정명령어 @ 사용
@ total = $listFlag + $purgeFlag + $fileFlag # 변수들을 연산하여 total 변수에 저장
if ($total != 1) goro error                            # 만약 total 변수가 1이 아니라면 실행
#
# junk 디렉토리가 없으면, 이를 생성
#
if (!(-e $junk)) then                                    # 만약 .junk 디렉토리가 없다면 실행
    'mkdir' $junk                                          # .junk 디렉토리 mkdir로 생성
endif                                                          # if 제어문 종료
#
#
#
#
# 옵션 처리
#
if ($listFlag) then                               # 변수 listFlag의 값이 1이라면 if제어문 실행 
    'ls' -lgF $junk                              
# junk 디렉토리 안의 파일나열 
    exit 0                                            
# 스크립트 정상종료
endif                                                # if제어문 종료
#
if ($purgeFlag) then                         # 변수 purgeFlag의 값이 1이라면 if제어문 실행
    'rm' $junk/*                                 # junk 디렉토리 내용 제거
    exit 0                                           # 스크립트 정상종료
endif                                               # if제어문 종료
#
if ($fileFlag) then                             # 변수 fileFlag의 값이 1이라면 if제어문 실행
    'mv' $fileList $junk                       # 파일을 junk 디렉토리로 이동 (일명 휴지통)
    exit 0                                          # 스크립트 정상종료
endif                                               # if제어문 종료
#
exit 0                                              # 스크립트 정상종료
#
# 에러 메시지 표시 후에 종료
error:                                             # goto문 레이블
cat << ENDOFTEXT        # 다음 ENDOFTEXT 나올때까지의 내용이 표준입력이 된다.
Dera $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                                  # HERE DOCUMENT
exit 1                                             # 스크립트 비정상종료


Comments