48
컴컴컴컴컴컴 컴컴컴 6 컴 . C 컴

6 장 . C 셸

  • Upload
    dima

  • View
    73

  • Download
    0

Embed Size (px)

DESCRIPTION

6 장 . C 셸. 컴퓨터공학과 강성인. 6.1 소개. C Shell 의 추가된 기능들 변수를 설정하고 접근하는 여러 가지 방법 조건 분기, 루프, 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명 (alias) 을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선. 6.2 시작하기. /bin/csh 시작순서 ① $HOME/.cshrc ( 새로운 C shell 이 실행될 때 마다 ) - PowerPoint PPT Presentation

Citation preview

Page 1: 6 장 . C  셸

컴퓨터공학과강성인

6 장 . C 셸

Page 2: 6 장 . C  셸

6.1 소개

C Shell 의 추가된 기능들 변수를 설정하고 접근하는 여러 가지 방법 조건 분기 , 루프 , 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명 (alias) 을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선

Page 3: 6 장 . C  셸

6.2 시작하기

/bin/csh 시작순서

① $HOME/.cshrc ( 새로운 C shell 이 실행될 때 마다 ) ② /etc/.login ( 로그인할 때만 ) ③ $HOME/.login ( 로그인할 때만 ) .cshrc 파일 : 자주 쓰이는 별명을 설정함 .login 파일 : $TERM, $PROMPT, $PATH 등의 변수 값을

설정함

Page 4: 6 장 . C  셸

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

Page 5: 6 장 . C  셸

6.3 변수

단순 변수의 생성과 할당 및 변수 해제 set {name [= word]}* unset {name}*

% set : 모든 지역 변수의 리스트가 나타남% set name = Graham Glass% set name = “Graham Glass" % echo $name

단순 변수로의 접근 ${name} : 변수 name 의 값 ( 접속 사용할 때 ) ${?name} : 변수 name 의 설정되어 있으면 1, 아니면 0 의

Page 6: 6 장 . C  셸

% 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

Page 7: 6 장 . C  셸

리스트 변수의 값 할당 set {name = ( {word}* ) }*

리스트 변수로의 접근 $name[selector] : 리스트 변수 name 의 값 ( 독립 사용할 때 ) ${name[selector]} : 리스트 변수 name 의 값 ( 접속 사용할 때 ) $#name : 리스트 변수 name 의 원소들의 개수 ( 독립 사용할 때 ) ${#name} : 리스트 변수 name 의 원소들의 개수 ( 접속 사용할 때 )

※ selector : [start-end] 형태 , start 가 명시 안되면 1 로 간주 ,

end 가 생략되면 마지막 원소의 인덱스로 간주 * 는 모든 범위 리스트 변수의 추가

원래의 리스트에 원소를 더하고 , 이들을 괄호로 묶어 원래 변수로 치환

Page 8: 6 장 . C  셸

% 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

Page 9: 6 장 . C  셸

미리 정의된 여러 지역 / 환경 변수들 (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

Page 10: 6 장 . C  셸

환경 변수의 값 할당 및 해제 setenv name word

unsetenv name(ex)% setenv TERM vt100

% echo $TERM

미리 정의된 환경 변수 공통적으로 미리 정의된 환경 변수

$HOME $PATH $MAIL $USER $SHELL $TERM

C shell 특유의 환경 변수

$LOGNAME ( 셸 소유자의 사용자 id)

Page 11: 6 장 . C  셸

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

Page 12: 6 장 . C  셸

산술 연산식 산술 연산식을 계산할 때 널 문자열은 0 과 동일하게 취급 &, &&, ||, |, <, >, >>, << 연산자들은 셸이 특별하게 번역하는

것을 막기 위해 괄호로 묶어야 한다 .

연산식의 결과를 변수에 할당하기 위해서는 set 명령을 사용하지 않고 내장 명령어 “ @” 를 사용 .

※ @ 이후의 연산식은 반드시 공백으로 분리

@: 모든 셸 변수들을 표시

@ variable op expression : variable 에 expression 의 결과 할당

@ variable[index] op expression : variable 의 index 번째에 할당

op : =, +=, -=, *=, /=, ++, -- 연산자 사용 가능

Page 13: 6 장 . C  셸

의 미연산자 연산자 의 미

-

!

* / %

+ -

<< >>

unary 음수

논리적부정

곱셈 , 나눗셈 , 나머지

덧셈 , 뺄셈

Bitwise shift

<= >= < > 관계 연산

== != 같다 , 같지 않다

& ^ | Bitwise and,xor,or

&& || logical and, or

Page 14: 6 장 . C  셸

% 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

Page 15: 6 장 . C  셸

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 은 디렉토리이다 .

Page 16: 6 장 . C  셸

% 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.

Page 17: 6 장 . C  셸

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

Page 18: 6 장 . C  셸

6.6 별명 (Aliases) 자신만의 고유한 명령어를 만들어 사용한다

alias [word [string] ]

unalias pattern

pattern 과 일치하는 별명을 제거한다 . 만일 pattern 에 * 가 사용되면 모든 별명을 제거한다 .

유용한 별명 (P.262) % alias cd 'cd \!*; set prompt="$cwd \!>"; ls'

지정된 디렉토리로 이동하고 , prompt 를 현재의 디렉토리와 마지막 명령 번호를 포함하도록 한 후 , 현재의 목록을 보여줌

\!* ( 두 번째부터 마지막번째까지의 토큰 즉 모든 인수들 )

\! ( 마지막 명령어의 번호 )

Page 19: 6 장 . C  셸

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 개의 명령어를 저장함

Page 20: 6 장 . C  셸

히스토리 읽기 history [-rh] [number]

옵션이 없으면 마지막 $history 명령을 나열한다

-r 히스토리의 역순으로 읽는다

-h 사건 번호의 표시를 금지한다

number 읽을 명령어의 개수

명령어의 재실행 재실행된 명령어 텍스트는 echo 된 후 실행된다

!! : 마지막 명령의 텍스트로 치환된다 !number : 명시된 사건 번호를 갖는 명령의 텍스트로 치환된다 !prefix : prefix 로 시작되는 마지막 명령의 텍스트로 치환된다 !?substring? : substring 을 포함하는 마지막 명령의 텍스트로 치환

(예 ) % !41 41 번째 명령어를 실행함

Page 21: 6 장 . C  셸

히스토리 수정자 (modifier) 사건 명시자 바로 뒤에 나와서 이전 명령의 일부에 접근:0 : 첫 번째 토큰:number : (number+1) 번째 토큰:start-end : (start+1) 부터 (end+1) 번째 토큰:^ : 두 번째 토큰 (:은 생략 가능 ):$ : 마지막 번째 토큰 (:은 생략 가능 ):* : 두 번째부터 마지막번째 토큰 (:은 생략 가능 )

Page 22: 6 장 . C  셸

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 >

Page 23: 6 장 . C  셸

파일 수정자 기존의 히스토리 수정자에 덧붙여 파일 이름의 특정한 부분을

접근함 :h 파일의 바로 앞 부분 :r 파일의 루트 부분 :e 파일의 확장자 부분 :t 파일의 뒤 부분

대치 수정자 텍스트가 대치된 후 재실행됨

!event:s/pattern1/pattern2/

Page 24: 6 장 . C  셸

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 >

Page 25: 6 장 . C  셸

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

Page 26: 6 장 . C  셸

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

Page 27: 6 장 . C  셸

if-then-else-endif

if ( expr) command

if ( expr1) then

commandlist1else if ( expr2 ) then

commandlist2else

commandlist3endif

Page 28: 6 장 . C  셸

% 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

Page 29: 6 장 . C  셸

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

Page 30: 6 장 . C  셸

repeat 단일 명령어를 지정된 시간의 수만큼 반복 수행한다

while-end 참인 동안 명령어를 반복 수행함

repeat expr command

while ( expr )commandlist

end

(cf.) breakcontinue

% repeat 2 echo hi there 2 개의 줄 표시hi therehi there

Page 31: 6 장 . C  셸

% 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

Page 32: 6 장 . C  셸

switch-case-endsw 다중 분기 지원

switch (expr)case pattern1 :

commandlist1breaksw

case pattern2 :case pattern3 :

commandlist2breaksw

default :commandlist2

endsw

Page 33: 6 장 . C  셸

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

Page 34: 6 장 . C  셸

파일 이름 대치파일 이름 대치 금지 : 변수 $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

Page 35: 6 장 . C  셸

리다이렉션 표준 에러 채널을 리다이렉션 : >& 또는 >>& 의도하지 않은 덮어씌우기로부터 파일 보호 : $noclobber 설정 (default: 비설정 )

/home/sikang >lls >& error/home/sikang >cat errorlls: 명령어가 없음/home/sikang >set noclobber/home/sikang >cp >& errorerror: 파일 있음

Page 36: 6 장 . C  셸

표준출력 뿐 아니라 표준에러도 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

Page 37: 6 장 . C  셸

개선된 작업제어

명령 기능jobs 작업을 표시bg 명시된 작업을 후면에 위치fg 명시된 작업을 전면에 위치kill 임의의 시그널을 프로세스 또는 작업으로 전송

Page 38: 6 장 . C  셸

모든 셸 작업 목록을 화면에 표시 -l 옵션을 사용하면 프로세스 ID 가 리스트에 추가 출력구문의 형식 job# [ +/- ] PID Status Command + 는 후면에 위치한 마지막 작업 의미 - 는 마지막에서 두 번째 작업 의미 status 는 다음중의 하나이다 .

jobs [-l]

status 의미Running 수행 중

Stopped 일시 중단

Terminated 시그널에 의해 사멸됨

Done 종료코드는 0

Exit 종료코드는 0 이 아닌 값

Page 39: 6 장 . C  셸

/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

Page 40: 6 장 . C  셸

작업 명시: bg, fg, kill 명령은 다음 형식 중 하나를 사용하여 job 을 명시할 수 있게 한다 .

형식 명시%integer 작업 번호 integer

%prefix prefix 로 이름이 시작하는 작업%+ 마지막으로 참조된 작업%% “%+” 와 동일%- 마지막에서 두 번째로 참조된 작업

Page 41: 6 장 . C  셸

명시된 작업을 후면 프로세서로 다시 시작 명시된 작업이 없으면 마지막 참조된 작업 다시 시작

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

Page 42: 6 장 . C  셸

명시된 작업을 전면 프로세서로 다시 시작 명시된 작업이 없으면 마지막 참조된 작업 다시 시작

fg [ %job]

/home/sikang >sleep 1000& : 후면 프로세스 시작[4] 4193[3] Done sleep 100/home/sikang >fg %sl : “sl” 로 시작하는 명령어 전면에서 다시 시작sleep 1000

Page 43: 6 장 . C  셸

지정된 작업을 중단한다 .

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

Page 44: 6 장 . C  셸

6.10 추가 내장 명령어

스크립트를 현재의 셸에 의해 번역 실행하여 영향을 주고자 할 때 사용한다 .(Korn 셸의 도트명령 (.) 과 같은 기능 )

(예 )% source .login

→ .login 파일을 재실행 ( 서브셸을 부르지않음 )

source [-h] fileName

Page 45: 6 장 . C  셸

6.11 디렉토리 스택

명시된 디렉토리를 디렉토리 스택에 추가시킴name 이 주어지면 , 현재 작업 디렉토리는 스택에 삽입되고 , 셸은

주어진 이름의 디렉토리로 옮겨간다number 가 주어지면 , 스택의 number 번째 원소는 스택의 탑으로 옮겨지고 현재의 작업 디렉토리가 된다 . 스택의 원소는 탑을 0 으로하여 오름차순으로 번호가 메겨져 있다 .

인수가 주어지지 않으면 , 스택 탑의 두 원소는 자리바꿈을 한다

pushd [ +number | name ]

Page 46: 6 장 . C  셸

명시된 디렉토리를 디렉토리 스택에 삭제한다 .

number 가 주어지면 , 셸은 스택의 number 번째 디렉토리를 디렉토리 스택에서 삭제한다 .

인수가 주어지지 않으면 , 셸은 스택 탑의 디렉토리로 옮겨가고 그 디렉토리를 스택에서 삭제한다 .

현재 디렉토리 스택의 내용을 보여 준다

popd [ +number ]

dirs

Page 47: 6 장 . C  셸

%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: 디렉토리 스택이 비어 있음

Page 48: 6 장 . C  셸

hash table C shell 은 해시 테이블이라는 내부적 자료 구조를 유지하여

실행파일 탐색을 빠르게 함 $PATH 가 바뀔 때마다 새로운 실행파일이 $PATH 안의 어떤 디렉토리에 해시 테이블을 다시 작성한다 .

해시 테이블은 .cshrc 파일이 읽혀질 때 마다 자동적으로 작성되고 rehash 명령을 사용하면 다시 작성된다 .

hashstat 명령은 해시 통계 자료 표시