View
73
Download
0
Category
Preview:
DESCRIPTION
6 장 . C 셸. 컴퓨터공학과 강성인. 6.1 소개. C Shell 의 추가된 기능들 변수를 설정하고 접근하는 여러 가지 방법 조건 분기, 루프, 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명 (alias) 을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선. 6.2 시작하기. /bin/csh 시작순서 ① $HOME/.cshrc ( 새로운 C shell 이 실행될 때 마다 ) - PowerPoint PPT Presentation
Citation preview
컴퓨터공학과강성인
6 장 . C 셸
6.1 소개
C Shell 의 추가된 기능들 변수를 설정하고 접근하는 여러 가지 방법 조건 분기 , 루프 , 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명 (alias) 을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선
6.2 시작하기
/bin/csh 시작순서
① $HOME/.cshrc ( 새로운 C shell 이 실행될 때 마다 ) ② /etc/.login ( 로그인할 때만 ) ③ $HOME/.login ( 로그인할 때만 ) .cshrc 파일 : 자주 쓰이는 별명을 설정함 .login 파일 : $TERM, $PROMPT, $PATH 등의 변수 값을
설정함
80 /home2/stud/04/sikang >cat .cshrc# @(#)cshrc 1.11 89/11/29 SMIumask 022set path=(/bin /usr/bin /usr/ucb /etc .)if ( $?prompt ) then set prompt="\! $cwd >" set history=32 set savehist=5 set noclobber filec set ignoreeof alias cd 'cd \!*;set prompt="\! $cwd >"; ls -F' alias ls ls -F alias rm rm -i alias h history alias ll ls -lendif
6.3 변수
단순 변수의 생성과 할당 및 변수 해제 set {name [= word]}* unset {name}*
% set : 모든 지역 변수의 리스트가 나타남% set name = Graham Glass% set name = “Graham Glass" % echo $name
단순 변수로의 접근 ${name} : 변수 name 의 값 ( 접속 사용할 때 ) ${?name} : 변수 name 의 설정되어 있으면 1, 아니면 0 의
값
% 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.cshflag is set
리스트 변수의 값 할당 set {name = ( {word}* ) }*
리스트 변수로의 접근 $name[selector] : 리스트 변수 name 의 값 ( 독립 사용할 때 ) ${name[selector]} : 리스트 변수 name 의 값 ( 접속 사용할 때 ) $#name : 리스트 변수 name 의 원소들의 개수 ( 독립 사용할 때 ) ${#name} : 리스트 변수 name 의 원소들의 개수 ( 접속 사용할 때 )
※ selector : [start-end] 형태 , start 가 명시 안되면 1 로 간주 ,
end 가 생략되면 마지막 원소의 인덱스로 간주 * 는 모든 범위 리스트 변수의 추가
원래의 리스트에 원소를 더하고 , 이들을 괄호로 묶어 원래 변수로 치환
% set colors = ( red yellow green )
% echo $colorsred yellow green% 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
미리 정의된 여러 지역 / 환경 변수들 (P.253 표 참조 )
%cat var5.csh#echo -n "please enter your name: "set name = $< #input stringecho hi $name, your current directory is $cwd%var5.cshplease enter your name: ksihi ksi, your current directory is /home/sikang
환경 변수의 값 할당 및 해제 setenv name word
unsetenv name(ex)% setenv TERM vt100
% echo $TERM
미리 정의된 환경 변수 공통적으로 미리 정의된 환경 변수
$HOME $PATH $MAIL $USER $SHELL $TERM
C shell 특유의 환경 변수
$LOGNAME ( 셸 소유자의 사용자 id)
6.4 연산식 문자열 연산식
의 미연산자 연산자 의 미
==
!=
=~
!~
같으면 참
같지 않으면 참
== 와 동일 .단 , 오른쪽에 대표문자 포함
!= 와 동일 .단 , 오른쪽에 대표문자 포함
% cat expr1.csh echo -n "do you like C shell? set reply = $<if ( $reply == "yes" ) then
echo you entered yeselse if ( $reply =~ " y* " ) then # 대표문자 포함 가능
echo I assume you mean yesendif% expr1.cshdo you like the C shell? yeahI assume you mean yes
산술 연산식 산술 연산식을 계산할 때 널 문자열은 0 과 동일하게 취급 &, &&, ||, |, <, >, >>, << 연산자들은 셸이 특별하게 번역하는
것을 막기 위해 괄호로 묶어야 한다 .
연산식의 결과를 변수에 할당하기 위해서는 set 명령을 사용하지 않고 내장 명령어 “ @” 를 사용 .
※ @ 이후의 연산식은 반드시 공백으로 분리
@: 모든 셸 변수들을 표시
@ variable op expression : variable 에 expression 의 결과 할당
@ variable[index] op expression : variable 의 index 번째에 할당
op : =, +=, -=, *=, /=, ++, -- 연산자 사용 가능
의 미연산자 연산자 의 미
-
!
* / %
+ -
<< >>
unary 음수
논리적부정
곱셈 , 나눗셈 , 나머지
덧셈 , 뺄셈
Bitwise shift
<= >= < > 관계 연산
== != 같다 , 같지 않다
& ^ | Bitwise and,xor,or
&& || logical and, or
% cat expr3.csh#set a = 3set b = 5if ($a > 2 && $b > 4) then
echo expression evaluation seems to workendif% expr3.cshecho expression evaluation seems to work
% set a = 2 * 2 set: Syntax error.% @ a = 2 * 2 ; 반드시 공백 분리% echo $a 4% @ a = $a + $a% set flag = 1 % @ b = ( $a && $flag ) ; && 때문에 괄호 필요% echo $b1% @ flag ++ : ++ 혹은 -- 연산 가능% echo $flag2
6.4 연산식
파일 지향 연산식
-option "fileName" 만일 옵션이 참이면 1 을 , 아니면 0 을 반환 만일 fileName 이 존재하지 않거나 접근할수 없으면 0 을 반환
의 미옵 션 옵 션 의 미
r
w
x
e
o
z
f
d
셸은 fileName 에 대해읽기 허가를 갖는다 .
셸은 fileName 에 대해쓰기 허가를 갖는다 .
셸은 fileName 에 대해실행 허가를 갖는다 .
fileName 이 존재한다 .
셸 프로그램와 fileName 의소유자가 동일하다 .
fileName 이 존재하고 크기가 0 이다 .
fileName 은 정규파일이다 .
fileName 은 디렉토리이다 .
% 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 erasedendif% expr4.cshenter the name of the fiie you wish to erase: /you do not have permission to erase that file.
6.5 파일 이름 완성
명령줄에 긴 파일 이름을 입력하는 것을 피할 수 있다 . set filec
filec 변수를 먼저 설정한다 . 파일 이름의 일부를 입력하고 ESC 누름
유일한 파일식별가능 : 나머지 자동추가 식별불가능 : 입력한 내용 아무 변화 없음
120 /home/sikang >ls -al .log* ; 유일한 파일-rw-r--r-- 1 sikang 2008 623 4 월 28 일 22:32 .login
121 /home/sikang >ls -al .login ; .l 을 추가한후 ESC 키 입력-rw-r--r-- 1 sikang 2008 623 4 월 28 일 22:32 .login
6.6 별명 (Aliases) 자신만의 고유한 명령어를 만들어 사용한다
alias [word [string] ]
unalias pattern
pattern 과 일치하는 별명을 제거한다 . 만일 pattern 에 * 가 사용되면 모든 별명을 제거한다 .
유용한 별명 (P.262) % alias cd 'cd \!*; set prompt="$cwd \!>"; ls'
지정된 디렉토리로 이동하고 , prompt 를 현재의 디렉토리와 마지막 명령 번호를 포함하도록 한 후 , 현재의 목록을 보여줌
\!* ( 두 번째부터 마지막번째까지의 토큰 즉 모든 인수들 )
\! ( 마지막 명령어의 번호 )
6.7 히스토리 키보드로부터 받은 명령어의 기록을 보존 번호가 붙여진 명령어
효과적인 사용을 위해 , prompt 에 명령어의 번호가 붙음% set prompt = “\! $cwd >”1 /home/sikang >_
관련환경 변수 $history : 히스토리 목록의 크기 , default = 1 $savehist
히스토리 파일 ($HOME/.history) 에 저장되는 명령 어의 수 세션 간에 명령어 접근을 허용하는 능력 .history 파일은 같은 사용자에 의하여 생성된 모든 대화형 C
shell 에 의하여 공유된다 . % set history = 100 마지막 100 개의 명령어를 기억하도록 함 % set savehist = 32 세션들 사이에 32 개의 명령어를 저장함
히스토리 읽기 history [-rh] [number]
옵션이 없으면 마지막 $history 명령을 나열한다
-r 히스토리의 역순으로 읽는다
-h 사건 번호의 표시를 금지한다
number 읽을 명령어의 개수
명령어의 재실행 재실행된 명령어 텍스트는 echo 된 후 실행된다
!! : 마지막 명령의 텍스트로 치환된다 !number : 명시된 사건 번호를 갖는 명령의 텍스트로 치환된다 !prefix : prefix 로 시작되는 마지막 명령의 텍스트로 치환된다 !?substring? : substring 을 포함하는 마지막 명령의 텍스트로 치환
(예 ) % !41 41 번째 명령어를 실행함
히스토리 수정자 (modifier) 사건 명시자 바로 뒤에 나와서 이전 명령의 일부에 접근:0 : 첫 번째 토큰:number : (number+1) 번째 토큰:start-end : (start+1) 부터 (end+1) 번째 토큰:^ : 두 번째 토큰 (:은 생략 가능 ):$ : 마지막 번째 토큰 (:은 생략 가능 ):* : 두 번째부터 마지막번째 토큰 (:은 생략 가능 )
6 /home/sikang >echo I like horseback ridingI like horseback riding7 /home/sikang >!!:0 !!:1 !!:2 !!:4 ; 지정된 인수로 접근echo I like ridingI like riding8 /home/sikang >echo !6:1-$ ; 인수의 범위로 접근echo I like horseback ridingI like horseback riding9 /home/sikang >echo !6* ; 인수의 두 번째 토큰부터 마지막 토큰echo I like horseback ridingI like horseback riding10 /home/sikang >
파일 수정자 기존의 히스토리 수정자에 덧붙여 파일 이름의 특정한 부분을
접근함 :h 파일의 바로 앞 부분 :r 파일의 루트 부분 :e 파일의 확장자 부분 :t 파일의 뒤 부분
대치 수정자 텍스트가 대치된 후 재실행됨
!event:s/pattern1/pattern2/
11 /home/sikang >ls /usr/include/stdio.h/usr/include/stdio.h12 /homesikang >echo !11:1:h ; 파일의 바로 앞 부분echo /usr/include/usr/include13 /home/sikang >echo !11:1:r ; 파일의 루트 부분echo /usr/include/stdio/usr/include/stdio14 /home/sikang >echo !11:1:e ; 파일의 확장자 부분echo hh15 /home/sikang >echo !11:1:t ; 파일의 뒤 부분 echo stdio.hstdio.h16 /home/sikang >echo !11:1:s/stdio/signal/ ; 대치수행echo /usr/include/signal.h/usr/include/signal.h17 /home/sikang >
6.8 제어구조
foreach-end 명령어 목록이 반복 실행됨 , 반복할 때마다 해당 변수가 다른 값을 가짐
foreach name ( wordlist ) commandlistend
% cat foreach.csh#foreach color (red yellow green blue) echo one color is $colorend% foreach.cshone color is redone color is yellowone color is greenone color is blue
goto 무조건 분기
goto label………
label :
% cat goto
#
echo gotta jump!
goto endOFScript
echo I'll never echo this
endOFScript:
echo the end % goto.cshgotta jump!the end
if-then-else-endif
if ( expr) command
if ( expr1) then
commandlist1else if ( expr2 ) then
commandlist2else
commandlist3endif
% cat if.csh#echo -n 'enter a number: ' # prompt user.set number = $<if ($number < 0) then
echo negativeelse if ($number == 0) then
echo zeroelse
echo positiveendif% if.cshenter a number: -1negative
Onintr 키보드로부터 C (interrupt, SIGINT) 값을 받았을 때 분기하도록
지시 onintr [ - | label ] - 인터럽트 무시
label: label 로 분기
% cat onintr.csh#onintr controlCwhile (1) echo infinite loop sleep 2endcontrolC:echo control C detected% onintr.cshinfinite loopinfinite loop^Ccontrol C detected
repeat 단일 명령어를 지정된 시간의 수만큼 반복 수행한다
while-end 참인 동안 명령어를 반복 수행함
repeat expr command
while ( expr )commandlist
end
(cf.) breakcontinue
% repeat 2 echo hi there 2 개의 줄 표시hi therehi there
% cat multi.csh#set x = 1 # set outer loop valuewhile ($x <= $1) # outer loop set y = 1 # set inner loop value while ($y <= $1) # inner loop @ v = $x * $y # calculate entry echo -n $v " " # display entry @ y ++ # update inner loop counter end echo "" # newline @ x ++ # update outer loop counterend% multi.csh 71 2 3 4 5 6 72 4 6 8 10 12 143 6 9 12 15 18 214 8 12 16 20 24 285 10 15 20 25 30 356 12 18 24 30 36 427 14 21 28 35 42 49
switch-case-endsw 다중 분기 지원
switch (expr)case pattern1 :
commandlist1breaksw
case pattern2 :case pattern3 :
commandlist2breaksw
default :commandlist2
endsw
6.9 개선점
명령어 재실행 ^ pattern1^pattern2 ( 이전 명령어에만 적용 )
메타문자 { } a{b,c}d → abd acd( 접두사 , 접미사의 입력시간 감소 )
(ex) % cp /usr/include/{stdio,signal}.h . → 두 파일을 복사
18 /home/sikang >ls -l .cshr.cshr: 해당 파일이나 디렉토리가 없음19 /home/sikang >^.cshr^.cshrcls -l .cshrc-rw-r--r-- 1 sikang 2008 345 4 월 28 일 09:45 .cshrc
파일 이름 대치파일 이름 대치 금지 : 변수 $noglob 설정 (default: 비설정 )패턴 불일치시 에러 보고 금지 : 변수 $nonomatch 설정 (default: 비설정 )→ Refer to ‘set’, ‘unset’
% echo p*prog1.c prog2.c% set noglob : 대표문자 처리 금지% echo p*p*% unset noglob% echo *aecho: No match.% set nonomatch : 에러 발생하지 않고 원래 패턴 인쇄% echo *a*a
리다이렉션 표준 에러 채널을 리다이렉션 : >& 또는 >>& 의도하지 않은 덮어씌우기로부터 파일 보호 : $noclobber 설정 (default: 비설정 )
/home/sikang >lls >& error/home/sikang >cat errorlls: 명령어가 없음/home/sikang >set noclobber/home/sikang >cp >& errorerror: 파일 있음
표준출력 뿐 아니라 표준에러도 pipe 시킴 |&
(예 ) % cc a.c |& more
( 예 )% (cc a.c > file1) |& more
cc a.c 의 표준 출력은 file1 으로 저장하고 , 명령어 그룹의 출력과 에러 채널을 more 로 파이프 처리함
/home/sikang >lls | wc -wlls: 명령어가 없음 0/home/sikang >lls |& wc -w 3
개선된 작업제어
명령 기능jobs 작업을 표시bg 명시된 작업을 후면에 위치fg 명시된 작업을 전면에 위치kill 임의의 시그널을 프로세스 또는 작업으로 전송
모든 셸 작업 목록을 화면에 표시 -l 옵션을 사용하면 프로세스 ID 가 리스트에 추가 출력구문의 형식 job# [ +/- ] PID Status Command + 는 후면에 위치한 마지막 작업 의미 - 는 마지막에서 두 번째 작업 의미 status 는 다음중의 하나이다 .
jobs [-l]
status 의미Running 수행 중
Stopped 일시 중단
Terminated 시그널에 의해 사멸됨
Done 종료코드는 0
Exit 종료코드는 0 이 아닌 값
/home/sikang >sleep 30&[1] 4177/home/sikang >sleep 30&[2] 4178/home/sikang >jobs[1] - Running sleep 30[2] + Running sleep 30/home/sikang >jobs -l[1] - 4177 Running sleep 30[2] + 4178 Running sleep 30
작업 명시: bg, fg, kill 명령은 다음 형식 중 하나를 사용하여 job 을 명시할 수 있게 한다 .
형식 명시%integer 작업 번호 integer
%prefix prefix 로 이름이 시작하는 작업%+ 마지막으로 참조된 작업%% “%+” 와 동일%- 마지막에서 두 번째로 참조된 작업
명시된 작업을 후면 프로세서로 다시 시작 명시된 작업이 없으면 마지막 참조된 작업 다시 시작
bg [ %job]
/home/sikang >sleep 100 : 전면 작업 시작^Z : 일지 중단중단됨 ( 사용자 )[2] Done sleep 30[1] - Done sleep 30/home/sikang >bg %+ : 마지막으로 참조된 작업을 후면 프로세스로 다시 시작[3] + sleep 100 &/home/sikang >jobs[3] + Running sleep 100
명시된 작업을 전면 프로세서로 다시 시작 명시된 작업이 없으면 마지막 참조된 작업 다시 시작
fg [ %job]
/home/sikang >sleep 1000& : 후면 프로세스 시작[4] 4193[3] Done sleep 100/home/sikang >fg %sl : “sl” 로 시작하는 명령어 전면에서 다시 시작sleep 1000
지정된 작업을 중단한다 .
stop {%job}*
/home/sikang >sleep 100&[1] 4237/home/sikang >stop %1[1] + 중단됨 ( 신호 ) sleep 100/home/sikang >jobs -l[1] + 4237 중단됨 ( 신호 ) sleep 100/home/sikang >kill 4237/home/sikang >jobs -l[1] 4237 종료됨 (Terminated) sleep 100
6.10 추가 내장 명령어
스크립트를 현재의 셸에 의해 번역 실행하여 영향을 주고자 할 때 사용한다 .(Korn 셸의 도트명령 (.) 과 같은 기능 )
(예 )% source .login
→ .login 파일을 재실행 ( 서브셸을 부르지않음 )
source [-h] fileName
6.11 디렉토리 스택
명시된 디렉토리를 디렉토리 스택에 추가시킴name 이 주어지면 , 현재 작업 디렉토리는 스택에 삽입되고 , 셸은
주어진 이름의 디렉토리로 옮겨간다number 가 주어지면 , 스택의 number 번째 원소는 스택의 탑으로 옮겨지고 현재의 작업 디렉토리가 된다 . 스택의 원소는 탑을 0 으로하여 오름차순으로 번호가 메겨져 있다 .
인수가 주어지지 않으면 , 스택 탑의 두 원소는 자리바꿈을 한다
pushd [ +number | name ]
명시된 디렉토리를 디렉토리 스택에 삭제한다 .
number 가 주어지면 , 셸은 스택의 number 번째 디렉토리를 디렉토리 스택에서 삭제한다 .
인수가 주어지지 않으면 , 셸은 스택 탑의 디렉토리로 옮겨가고 그 디렉토리를 스택에서 삭제한다 .
현재 디렉토리 스택의 내용을 보여 준다
popd [ +number ]
dirs
%cd /%dirs : 현재 디렉토리 스택의 내용을 표시/%pushd ~ : 홈디렉토리를 디렉토리 스택에 추가~ /%pwd : 현재 디렉토리가 홈디렉토리로 변경/home/sikang%pushd /etc : /etc 를 디렉토리 스택에 추가/etc ~ /%pushd +2 : 디렉토리 스택의 2 번째 원소인 “ /” 를 스택의 / /etc ~ 탑으로 이동 하고 현재 작업 디렉토리로 변경%pushd : 디렉토리 스택의 0 번째와 1 번째 원소가 자리 바꿈
/etc / ~%popd +2 : 2 번째 원소를 디렉토리 스택에서 삭제/etc /%popd : 스택의 탑에 있는 원소를 스택에서 삭제/%popd popd: 디렉토리 스택이 비어 있음
hash table C shell 은 해시 테이블이라는 내부적 자료 구조를 유지하여
실행파일 탐색을 빠르게 함 $PATH 가 바뀔 때마다 새로운 실행파일이 $PATH 안의 어떤 디렉토리에 해시 테이블을 다시 작성한다 .
해시 테이블은 .cshrc 파일이 읽혀질 때 마다 자동적으로 작성되고 rehash 명령을 사용하면 다시 작성된다 .
hashstat 명령은 해시 통계 자료 표시
Recommended