6. C 셀
6.1 소개 Shell의 공통적인 기능 이외에 C Shell에 추가된 기능들 변수를 설정하고 접근하는 여러 가지 방법 조건 분기, 루프, 인터럽트 조작을 지원하는 내장 프로그래밍 언어 별명을 사용한 주문화된 고유명령어 히스토리 메카니즘을 이용한 그 이전 명령어로의 접근 개선된 작업 제어 새로운 내장 명령어와 기존 명령어의 개선 6. C 셀
6.2 시작하기 /bin/csh 시작순서 .cshrc (run commands): 자주 쓰이는 별명을 설정함 ① $HOME/.cshrc ② /etc/.login ③ $HOME/.login .cshrc (run commands): 자주 쓰이는 별명을 설정함 .login : $TERM, $PROMPT, $PATH 등의 변수 값을 설정함 (예) .cshrc (예) .login 6. C 셀
6.3 변수 단순 변수의 값 할당 ① 지역 변수(단순 변수, 리스트 변수) ② 환경 변수 set {name [= word]}* % set name = M.J. KIM % set name = "M.J. KIM" % echo $name 6. C 셀
6.3 변수 단순 변수로의 접근 $name 변수 name의 값 (독립 사용할 때) ${name} Continue... 6.3 변수 단순 변수로의 접근 $name 변수 name의 값 (독립 사용할 때) ${name} 변수 name의 값 (접속 사용할 때) ${?name} 변수 name의 설정되어 있으면 1, 아니면 0의 값 6. C 셀
6.3 변수 (예) % 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 6. C 셀
6.3 변수 리스트 변수의 값 할당 set {name = ( {word}* ) }* (예) % set colors = ( red yellow green ) % echo $colors red yellow green 6. C 셀
6.3 변수 리스트 변수로의 접근 ① $name[selector] 리스트 변수 name의 값 (독립 사용할 때) Continue... 6.3 변수 리스트 변수로의 접근 ① $name[selector] 리스트 변수 name의 값 (독립 사용할 때) ② ${name[selector]} 리스트 변수 name의 값 (접속 사용할 때) ③ $#name 리스트 변수 name의 원소들의 개수 (독립 사용할 때) ④ ${#name} (접속 사용할 때) 6. C 셀
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 6. C 셀
6.3 변수 리스트 변수의 추가 원래의 리스트에 원소를 더하고, 이들을 괄호로 묶어 원래로 치환 (예) %set colors = ( red yellow green ) %set colors[4] = pink Subscript out of range %set colors = ( $colors blue ) %echo $colors res yellow green blue 6. C 셀
6.3 변수 C shell에 미리 정의된 여러 지역/환경 변수들 $?0 $< $argv $cdpath $cwd Continue... 6.3 변수 C shell에 미리 정의된 여러 지역/환경 변수들 $?0 $< $argv $cdpath $cwd $echo $home $history $histchars $mail $noglob $notify $path $prompt $shell $status $time $verbose $savehist $noclobber $nonomatch $ignoreeof 6. C 셀
6.3 변수 (예) % cat var5.csh [1-c6p249] echo -n "please enter your name: " set name = $< # atke a line of input echo hi $name, your current directory is $cwd 6. C 셀
6.3 변수 환경 변수의 값 할당 미리 정의된 환경 변수 setenv name word (예)% setenv TERM vt100 % echo $TERM 미리 정의된 환경 변수 ① 공통적으로 미리 정의된 환경 변수 $HOME $PATH $MAIL $USER $SHELL $TERM ② C shell 특유의 환경 변수 $LOGNAME (셀 소유자의 사용자 id) 6. C 셀
6.4 연산식 C shell의 연산식 ① 문자열 연산식 ② 산술 연산식 ③ 화일 지향적 연산식 6. C 셀
6.3 변수 문자열 연산식 의 미 연산자 == != =- !~ 같으면 참 같지 않으면 참 ==와 동일. Continue... 6.3 변수 문자열 연산식 의 미 연산자 == != =- !~ 같으면 참 같지 않으면 참 ==와 동일. 단, 오른쪽에 대표문자 포함 !=와 동일. 6. C 셀
6.3 변수 (예)% cat expr1.csh [1-c6p251] # 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 6. C 셀
6.4 연산식 산술 연산식 (C-like) 의 미 연산자 ~ ! * / % + - << >> Continue... 6.4 연산식 산술 연산식 (C-like) 의 미 연산자 ~ ! * / % + - << >> unary 음수 논리적부정 곱셈,나눗셈,나머지 덧셈, 뺄셈 bltwise shift <= >= < > 관계 연산 == != 같다, 같지 않다 & ^ | bit, and, xor, or && || logical and, or 6. C 셀
6.4 연산식 (예) % cat expr3.csh # set a = 3 set b = 5 Continue... 6.4 연산식 (예) % cat expr3.csh # set a = 3 set b = 5 if ($a > 2 && $b > 4) then echo expression evaluation seems to work endif 6. C 셀
6.4 연산식 연산식의 결과를 변수에 할당하기 위해서는 set 명령을 사용하지 않는다. @ 모든 셀 변수들을 표시 Continue... 6.4 연산식 연산식의 결과를 변수에 할당하기 위해서는 set 명령을 사용하지 않는다. @ 모든 셀 변수들을 표시 @variable op expression 변수 variable에 expression의 결과 할당 @variable[index] op expression variable의 index번째에 할당 6. C 셀
6.4 연산식 (예) % set a = 2 * 2 set: Syntax error. % @ a = 2 * 2 % echo $a 4 % @ a = $a + $a % @ b = ( $a && $flag) && 때문에 괄호 필요 % set value = 1 % @ value ++ ++ 혹은 -- 연산 가능 6. C 셀
6.4 연산식 화일 지향적 연산식 option "fileName" 만일 옵션이 참이면 1을, 아니면 0을 반환 Continue... 6.4 연산식 화일 지향적 연산식 option "fileName" 만일 옵션이 참이면 1을, 아니면 0을 반환 만일 fileName이 존재하지 않으면 0을 반환 의 미 옵 션 r w x e o z f d 셀은 fileName에 대해 읽기 허가를 갖는다. 쓰기 허가를 갖는다. 실행 허가를 갖는다. fileName이 존재한다. 셀 프로그램와 fileName의 소유자가 동일하다. fileName이 존재하되 크기 가 0이다. fileName은 정규화일이다. fileName은 디렉토리이다. 6. C 셀
6.4 연산식 (예) % cat expr4.csh # echo -n "enter the name of the fie you whish 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 6. C 셀
6.5 별명(Aliases) 자신만의 고유한 명령어를 만들어 사용한다 alias [word [string] ] (예) % alias word word가 어떤 string의 별명인지를 보여줌 (예) % alias dir 'ls -aF’ % alias ls 'ls -aF' (예)% alias who 'date; who' who에 대한 무한루프 발생(error) % alias who 'date; /bin/who' who의 절대경로 사용 해결 6. C 셀
6.5 별명(Aliases) unalias pattern pattern과 일치하는 별명을 제거한다. 6. C 셀
6.5 별명(Aliases) 유용한 별명 (.cshrc에 저장) Continue... 6.5 별명(Aliases) 유용한 별명 (.cshrc에 저장) % alias cd 'cd \!*; set prompt="$cwd\!>"; ls 지정된 디렉토리로 이동하고, prompt를 현재의 디렉토리와 마지막 명령 번호를 포함하도록 한 후, 현재의 목록을 보여줌 \!* (두 번째부터 마지막번째까지의 토큰 즉 모든 인수들) \! (마지막 명령어의 번호) % alias ls 'ls -F' 화일과 디렉토리에 관한 추가 정보 보이기 6. C 셀
6.5 별명(Aliases) % 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’ 상세한 목록 정보 얻기 6. C 셀
6.6 히스토리 번호가 붙여진 명령어 키보드로부터 받은 명령어들을 순서대로 기억해둠 효과적인 사용을 위해, prompt에 명령어의 번호가 붙음 % set prompt = '\! %’ 1 % echo hello 6. C 셀
6.6 히스토리 관련환경 변수 $history $savehist 히스토리 목록의 크기, defualt = 1 Continue... 6.6 히스토리 관련환경 변수 $history 히스토리 목록의 크기, defualt = 1 $savehist 히스토리 화일($HOME/.history) 에 저장되는 명령 어의 수 세션 간에 명령어 접근을 허용하는 능력 cf. .history화일은 같은 사용자에 의하여 생성된 모든 대화형 C shell에 의하여 공유된다. 6. C 셀
6.6 히스토리 (예)$ % set history 40 마지막 40개의 명령어를 기억하도록 함 (예)$ % set savehist 32 세션들 사이에 32개의 명령어를 저장함 6. C 셀
6.6 히스토리 히스토리 읽기 history [-rh] [number] 옵션이 없으면 마지막 $history 명령을 나열한다 마지막 3개의 명령어를 역순으로 읽음 6. C 셀
6.6 히스토리 명령어의 재실행 재실행된 명령어 텍스트는 echo된 후 실행된다 ① !! 마지막 명령의 텍스트로 치환된다 ① !! 마지막 명령의 텍스트로 치환된다 ② !number 명시된 사건 번호를 갖는 명령의 텍스트로 치환된다 ③ !prefix prefix로 시작되는 마지막 명령의 텍스트로 치환된다 ④ !?Substring? substring을 포함하는 마지막 명령의 텍스트로 치환 (예) % !41 41번째 명령어를 실행함 6. C 셀
6.6 히스토리 히스토리 수정자(midifier) 사건 명시자 바로 뒤에 나와서 이전 명령의 일부에 접근 Continue... 6.6 히스토리 히스토리 수정자(midifier) 사건 명시자 바로 뒤에 나와서 이전 명령의 일부에 접근 ① :0 첫 번째 토큰 ② :number (number+1)번째 토큰 ③ :start-end (start+1)부터 (end+1)번째 토큰 ④ :^ 첫 번째 토큰 (:은 생략 가능) ⑤ :$ 마지막 번째 토큰 (:은 생략 가능) ⑥ :* 두 번째부터 마지막번째 토큰 (:은 생략 가능) 6. C 셀
6.6 히스토리 (예)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 6. C 셀
6.6 히스토리 화일 수정자 기존의 히스토리 수정자에 덧붙여 화일 이름의 특정한 부분을 접근함 ① :h 화일의 바로 앞 부분 Continue... 6.6 히스토리 화일 수정자 기존의 히스토리 수정자에 덧붙여 화일 이름의 특정한 부분을 접근함 ① :h 화일의 바로 앞 부분 ② :r 화일의 루트 부분 ③ :e 화일의 확장자 부분 ④ :t 화일의 뒤 부분 6. C 셀
6.6 히스토리 (예) 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 6. C 셀
6.6 히스토리 대치 수정자 텍스트가 대치된 후 재실행됨 !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 6. C 셀
6.7 제어구조 foreach-end C-like 명령어 목록이 반복 실행됨, 반복시마다 해당 변수가 다른 값을 가짐 Continue... 6.7 제어구조 C-like foreach-end 명령어 목록이 반복 실행됨, 반복시마다 해당 변수가 다른 값을 가짐 foreach name ( wordlist ) commandlist end 6. C 셀
6.7 제어구조 (예)% 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 6. C 셀
6.7 제어구조 goto 무조건 분기 goto label ……… label : 6. C 셀
6.7 제어구조 if-then-else-endif if ( expr) command if ( expr1) then commandlist1 else if ( expr2 ) then commandlist2 else commandlist3 endif 6. C 셀
6.7 제어구조 Onintr 키보드로부터 ^C (interrrupt, SIGINT) 값을 받았을 때 분기하도록 지시 onintr [ - | label ] - 인터럽트 무시 label label로 분기 6. C 셀
6.7 제어구조 repeat (예) % repeat 2 echo hi there 2개의 줄 표시 단일 명령어를 지정된 시간의 수만큼 반복 수행한다 (예) % repeat 2 echo hi there 2개의 줄 표시 hi there repeat expr command 6. C 셀
6.7 제어구조 switch-case-endsw 다중 분기 지원 switch (expr) case pattern1 : commandlist1 breaksw case pattern2 : case pattern3 : commandlist2 defaut : endsw 6. C 셀
6.7 제어구조 while-end 참인 동안 명령어를 반복 수행함 while ( expr ) commandlist end cf. break continue 6. C 셀
6.7 제어구조 예제 : JUNK junk -lp {fileName}* 지정된 화일을 지우는 rm대신 사용하는 명령으로, 화일을 지우지않고 $HOME/.junk에 이동시킨다. -l $HOME/.junk의 내용을 보여준다(list). -p $HOME/.junk을 제거한다(purge). 만일 .junk 디렉토리가 없으면 자동으로 생성해준다. 6. C 셀
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 . → 두 파일을 복사 6. C 셀
6.9 개선점 화일 이름 대치 ① 화일 이름 대치 금지: 변수 $noglob 설정 (default: 비설정) Continue... 6.9 개선점 화일 이름 대치 ① 화일 이름 대치 금지: 변수 $noglob 설정 (default: 비설정) ② 패턴 불일치시 에러 보고 금지: 변수 $nonomatch 설정 (default: 비설정) 6. C 셀
6.9 개선점 (예) % echo *p prog1.c prog2.c % set noglob → 대표문자 처리 금지 (예) % echo *a echo: No match. % set nonomatch % echo *a *a → 에러 발생하지않고 원래 패턴 인쇄 6. C 셀
6.9 개선점 redirection ① 표준 에러 채널을 리다이렉션: >& 또는 >>& ② 에상외의 덮어씌우기로부터 화일 보호: $noclobber 설정 (default: 비설정) (예) % (process1 > file1) >& file12 →표준 출력은 file1으로 표준 에러는 file2로 저장함 (예) % set noclobber % cc a.c >& errors errors: File exists. 6. C 셀
6.9 개선점 표준출력 뿐 아니라 표준에러도 pipe시킴 |& (예) % cc a.c |& more (예)% (process1 > file1) |& process2 process1의 표준 출력은 file1으로 저장하고, 명령어 그룹의 출력과 에러 채널을 process2로 파이프 처리함 6. C 셀
6.9 개선점 작업 제어를 위한 추가적 내장명령어 제공 ① stop {%job}* 지정된 작업을 중단한다. Continue... 6.9 개선점 작업 제어를 위한 추가적 내장명령어 제공 ① stop {%job}* 지정된 작업을 중단한다. %job [1-c5p216] %integer 작업번호가 integer인 작업 %prefix prefix로 이름이 시작하는 작업 %+ 마지막으로 참조된 작업 (default) %% %+와 동일 %- 마지막에서 두 번째로 참조된 작업 (예) % stop %man % stop %1 6. C 셀
Continue... 6.9 개선점 ② suspend su나 script 등으로 불러들인 shell을 중단시킴 6. C 셀
6.9 개선점 ③ nice [+/- number] [command]] command의 우선순위를 number로 설정한다. Continue... 6.9 개선점 ③ nice [+/- number] [command]] command의 우선순위를 number로 설정한다. (적당한 때 수행) 우선순위가 높을수록 실행은 더 늦다. 슈퍼유저 만이 음수의 우선순위를 설정할 수 있다. 우선순위가 생략되면 4로 간주한다. command가 명시되지 않으면 현재의 shell에 대한 것으로 간주 6. C 셀
6.9 개선점 ④ nohup command command를 수행하고 모든 방해조건 으로부터 보호한다 Continue... 6.9 개선점 ④ nohup command command를 수행하고 모든 방해조건 으로부터 보호한다 command가 명시되어 있지 않으면 해당 셀의 모든 명령어가 됨 backgounding command도 해당됨에 주의 6. C 셀
6.9 개선점 ⑤ notify {%job}* 지정된 작업이 상태를 바꿀 때 즉시 통보 하도록 한다. Continue... 6.9 개선점 ⑤ notify {%job}* 지정된 작업이 상태를 바꿀 때 즉시 통보 하도록 한다. 모든 작업에 대해서 할 때는, $notify를 설정한다 ⑥ 로그인 셀의 다양한 종료 방법 ㈀ logout : login shell만을 종료 ㈁ exit : login shell 및 interactive shell의 종료 ㈂ control-D : 입력 종료 ($ignoreeof이 설정되면 무력해짐) 6. C 셀
6.9 개선점 C shell 종료시에, 2개의 끝내기 화일을 탐색 (예) % set ignoreeof % ^D Continue... 6.9 개선점 (예) % set ignoreeof % ^D use "logout" to logout % logout C shell 종료시에, 2개의 끝내기 화일을 탐색 ㈀ $HOME/.logout ㈁ /etc/logout cf. 끝내기 화일의 주요 내용 임시 디렉토리 지우기, 종료 메시지등 6. C 셀
6.10 추가 내장 명령어 chdir[path] glob {arg} cd와 동일 cho와 비슷하나, 마지막 출력에 공백대신 널(ASCII 0)로 arg 목록을 구분하는 것이 echo와 다름 6. C 셀
6.10 추가 내장 명령어 source [-h] fileName (예)% source .login → .login화일을 재실행 (서브셀을 부르지않음) 6. C 셀
6.11 디렉토리 스택 pushd [ +number | name ] 명시된 디렉토리를 디렉토리 스택에 추가시킴 ② -number가 주어지면, 스택의 number번째 원소는 스택의 탑으로 옮겨지고 현재의 작업 디렉토리가 된다. 스택의 원소는 탑을 0으로하여 오름차순으로 번호가 메겨져있다. ③ 인수가 주어지지 않으면, 스택 탑의 두 원소는 자리바꿈을 한다 6. C 셀
6.11 디렉토리 스택 popd [ +number ] 명시된 디렉토리를 디렉토리 스택에 삭제하고, 명시된 디렉토리를 디렉토리 스택에 삭제하고, ① -number가 주어지면, 셀은 스택의 number번째 디렉토리로 옮겨간다 ② 인수가 주어지지 않으면, 셀은 스택 탑의 디렉토리로 옮겨가고 그 디렉토리를 스택에서 삭제한다. 6. C 셀
6.11 디렉토리 스택 dirs 현재 디렉토리 스택의 내용을 보여준다 (예) % pwd /usr/mjkim 현재 디렉토리 스택의 내용을 보여준다 (예) % pwd /usr/mjkim % pushd / / ~ % pushd /usr/inlude /usr/include / ~ % pushd / /usr/include ~ % popd /usr/inlude ~ 6. C 셀
6.11 디렉토리 스택 hash table C shell은 해시 테이블이라는 내부적 자료 구조를 유지하여 실행화일 탐색을 빠르게 함 ① $PATH가 바뀔 때마다 ② 새로운 실행화일이 $PATH 안의 어떤 디렉토리에 해시 테이블을 다시 작성한다. (예) % rehash → 해시 테이블을 다시 작성 (예) % hashstat → 해시 통계 자료 표시 6. C 셀
6.12 명령줄 옵션 만일 명령 줄의 첫째 인수가 -라면, C shell은 login shell로 시작된다. Continue... 6.12 명령줄 옵션 만일 명령 줄의 첫째 인수가 -라면, C shell은 login shell로 시작된다. 여기에 추가로 C shell은 다음의 명령 줄 옵션을 지원한다. 표준 입력으로부터 한 줄을 읽고 실행한다. 의 미 옵션 -c string -e -f string 명령을 실행하기 위하여 셀을 생성한다. 어떤 명령어가 0이 아닌 종료 코드를 반환하면, 셀은 종료된다. 셀은 시작하지만, .cshrc에서 명령을 읽지는 않는다. -t -v -V $verbose를 설정하게 한다. .cshrc이 실행되기 전에 $verbose를 설정하는 것을 제외하고는 -v와 같다. 6. C 셀
6.12 명령줄 옵션 의 미 옵션 의 미 -i -n -s 대화형 셀을 형성한다. 즉, SIGTERM, SIGINT, SIGQUIT 메시지를 모두 무시하는 것을 제외하고는 -s와 같다. 명령을 문법적으로 분석 하지만, 실행하지는 않는다. 단지 디버깅을 위한 것임 표준 입력으로부터 명령을 읽고 셀 메시지를 표준 에러 채널에 보내는 셀을 생성한다. -x -X fileName .cshrc가 읽혀지기 전에 $echo를 설정하는 것을 제외하고는 -x와 같다. 만일 -c, -i, -s, -t 옵션이 사용되지 않으면 fileName에 있는 셀 명령어들을 실행한다. fileName 스크립트 내에서 fuleName은 $0이다. $echo를 설정하게 한다. 6. C 셀