1 / 43

3 장 . 유닉스 셸

3 장 . 유닉스 셸. 컴퓨터공학과 강성인. 1. 유닉스 셸. 정의 사용자와 순수 유닉스운영체제 사이에 위치하는 프로그램 셸 (shell) 의 종류 Borune shell (sh) 가장 오랜 동안 모든 unix 시스템의 표준 구성 요소 강력한 명령 프로그래밍 언어 기능을 가짐 C shell (csh) c 언어와 유사 대화형으로 많이 사용 Korn shell (ksh) Bourne 셸과 완전히 호환 C 셸의 대화형 기능 추가. 셸. 내장명령어. 스크립트. 변수. 리다이렉션.

latham
Download Presentation

3 장 . 유닉스 셸

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 3장. 유닉스 셸 컴퓨터공학과 강성인

  2. 1. 유닉스 셸 • 정의 사용자와 순수 유닉스운영체제 사이에 위치하는 프로그램 • 셸(shell)의 종류 • Borune shell (sh) • 가장 오랜 동안 모든 unix시스템의 표준 구성 요소 • 강력한 명령 프로그래밍 언어 기능을 가짐 • C shell (csh) • c 언어와 유사 • 대화형으로 많이 사용 • Korn shell (ksh) • Bourne셸과 완전히 호환 • C셸의 대화형 기능 추가

  3. 내장명령어 스크립트 변수 리다이렉션 대표문자 파이프 명령열 서브쉘 후면처리 명령어처리 지역 환경 조건부 무조건부 2.셸의 핵심적인 기능

  4. 3. 셸의 선택 • 셸의 선택 시스템 관리자가 사용자의 기본 셸을 정한다. • $ : Bourne 셸 또는 Korn 셸 • %: C 셸 • 자신의 login 셸 확인 $ echo $SHELL

  5. 4.셸 명령 • 단일 명령어 • 다중 명령어 • 순차 수행 • 동시수행 $ command [인 수] $ command 1; command 2; …………; command N $ command 1& command 2 & ………… & command N

  6. 5.메타 문자 • 셸이 특수하게 처리하는 문자 • 메타 문자의 특수한 의미를 없애기 위해서는 앞에 ‘\’를 삽입한다. $ echo hi > file // echo의 출력을 file에 저장 $ cat file // file의 내용 보기 hi $ echo hi \> file // 메타 문자 금지 hi > file $ _

  7. 기호 의 미 기호 의 미 Shell 명령어를 순서대로 구분 하여 나열할 때 사용하는 분리자 표준출력을 파일에 저장하는 출력 redirection > ; 표준출력을 파일에 추가 저장하는 출력 redirection 이전의 명령이 실패하면 실행 하도록 하는 조건부 명시 >> || 표준입력을 파일에서 읽어 들이는 입력 redirection 이전의 명령이 성공하면 실행하도록 하는 조건부 명시 < && word 바로 전줄까지를 임시 파일에 저장한 후 이 파일을 표준입력으로 읽어 들이는 입력 redirection  here document <<을 사용하는 script를 말합 Shell의 메타문자 앞에 붙어서 메타문자의 특수 의미를 제거함 $ echo hi > file $ echo hi \> file \ <<word

  8. 의 미 기호 의 미 기호 0개 이상의 문자와 일치 하는 화일 치환 대표 문자 그룹명령어 * (...) 단일 문자와 일치하는 화일 치환 대표 문자 후면 실행 (background processing) ? & [ 와 ] 사이의 어떤 문자 와도 일치하는 화일 치환 대표 문자. 문자의 범위는 대쉬(-)로 표현 Newline까지를 설명문으로 간주하여 처리함 [...] # 명령어 command의 출력에 의해서 대치 되는 명령어 치환 `command` $ Shell 변수의 값을 접근함 | 어떤 프로세스의 출력을 다른 프로세스의 입력으로 보내 주는 pipe

  9. 6.리다이렉션(Redirection) • 출력 리다이렉션 : 프로세스의 출력을 파일에 저장할 수 있게 한다. • 입력 리다이렉션 : 파일의 내용을 표준 입력으로 사용하는 리다이렉션 command > filename // command의 표준 출력을 filename파일로 보낸다. command >> filename //command의 표준 출력을 filename이라는 파일의 끝에 덧붙인다. command < filename // filename내용을 표준 입력으로 사용하여 command를 실행 command << word // word로 시작하는 줄의 앞줄까지의 표준 입력을 임시파일로 복사하고, 그 임시 파일의 내용을 표준 입력으로 사용하여 command를 실행

  10. $ cat > text //파일의 생성 I remember walking in the rain, on a cold and dark September, ^D // 입력의 끝 $ cat text // text파일 보기 I remember walking in the rain, on a cold and dark September, $ cat >> text //파일의 끝에 덧붙이기 brown Autumn leaves were falling softly to the ground. ^D $ cat text //text파일 보기 I remember walking in the rain, on a cold and dark September, brown Autumn leaves were falling softly to the ground. $ _

  11. $ cat > mail.txt test mail $ mail sikang < mail.txt $ mail From sikang Sat Mar 17 16:24:13 2007 Date: Sat, 17 Mar 2007 16:24:13 +0900 (KST) From: Kang <sikang> Message-Id: <200703170724.i2P7ODU03849@-a> Content-Length: 11 test mail ?

  12. 대표 문자 의 미 * 빈 문자열을 포함하는 어떤 문자열과도 일치. ? 어떤 단일 문자와 일치. [..] 대괄호 사이의 어떤 하나의 문자와 일치. 문자의 범위는 대시(-)기호로 문자의 쌍을 분리하 여 지정 가능하다. 7.파일 이름 대치(대표 문자) • 모든 셸은 파일 시스템에서 특정한 이름 패턴을 만족하는 파일을 선택할 수 있게 대표 문자 기능을 지원한다.

  13. $ ls -FR // 현재 디렉토리를 순환적으로 표시 a.c b.c cc.c dir1/ dir2/ dir1: d.c e.e dir2: f.d g.c $ ls *.c //” .c”로 끝나는 모든 것 a.c b.c cc.c $ ls ?.c //”c”앞에 하나의 문자가 있는 것 a.c b.c $ ls [ac]* // “a” 또는 “c”로 시작하는 모든 것 a.c cc.c $ ls [A-Z a-z]* // 영문자로 시작하는 모든 것 a.c b.c cc. $ ls dir */*.c // “dir*” 디렉토리에서 “ .c”로 끝나는 모든 파일들 dir1/d.c dir2/g.c

  14. command1 | command2 // command1의 표준 출력을 command2의 표준 입력으로 사용 $ ls // 현재 디렉토리 표시 a.c b.c cc.c $ ls | wc -w // 엔트리의 수 표시 3 $ _ command1 command2 터미널 파이프 ls Wc -w 터미널 파이프 8.파이프 (Pipes)

  15. 터미널 ls sort -r more 파이프 파이프 $ pwd /home/sikang $ cd .. $ ls | sort -r | more zzinga ytkoo ytk00 ysh34 young70111 …

  16. tee -ia {filename} -i: 인터럽트를 무시한다. -a: 입력을 파일에 덮어씌우지 않고 대신에 그 파일의 끝에 덧붙인다. 파이프 command1 command2 터미널 tee file 9.파이프라인의 분리: tee : 파이프의 결과를 파일에 복사하고, 계속 파이프라인을 따라 흐르게 하는 기능

  17. $ who | tee who.txt | sort // tee를 이용하여 파이프 자료 복사 James pts/6 3월 14 11:19 root console 3월 12 13:56 root pts/3 3월 12 13:57 root pts/4 3월 12 13:57 $ cat who.txt // who.txt 파일 보기 root console 3월 12 13:56 James pts/6 3월 14 11:19 root pts/3 3월 12 13:57 root pts/4 3월 12 13:57 $ _

  18. 10. 명령어 대치 • 악센트 부호 “` ”로 둘러 싸인 명령어는 실행되어 결과값이 표준 출력으로 출력된다. $ echo there are `who | wc -l` users on the system there are 7 users on the system $ echo there are 'who | wc -l' users on the system there are who | wc -l users on the system $_

  19. 11. 명령열 • ‘ ; ’으로 명령어를 구분한다. • 셸은 왼쪽에서 오른쪽으로 차례로 실행한다. • 전체 동작의 순서를 한번에 지정할 수 있다. $ date; pwd; ls 2007년 3월 17일 토요일 오후 02시 46분 27초 /home/sikang a.c b.c cc.c $ date > date.txt; ls; pwd > pwd.txt //첫번째와 세번째 명령을 리다이렉트 a.c b.c cc.c date.txt $ cat date.txt 2007년 3월 17일 토요일 오후 02시 46분 50초 $ cat pwd.txt /home/sikang

  20. 조건부 명령열 • 모든 유닉스 프로세스는 종료 값을 가지고 끝난다. • 종료 값이 0이면 프로세스가 성공적으로 완결되었음을 의미 0이 아닌 종료 값은 실패를 나타낸다. &&: 이전 명령의 종료 값으로 0을 반환할 경우만 다음 명령이 실행된다. || : 이전 명령의 종료 값으로 0이 아닌 값을 반환 할 경우만 다음 명령이 실행된다. $ cd && echo 현재위치는 `pwd`입니다. //성공적인 종료이므로 우측실행 현재위치는 /입니다. $ cdd || echo 존재하지 않는 명령어 입니다. //비정상적인 종료이므로 우측실행 cdd: 없음 존재하지 않는 명령어 입니다.

  21. 12.명령어 그룹 • 명령어들을 괄호 안에 그룹으로 묶어, 이를 하나의 자식 셸 (서브 셸)에서 실행하게 한다. • 표준 입력 채널, 표준 출력 채널, 표준 에러 채널을 공유 • 리다이렉션과 파이프 처리 가능 $ date; ls; pwd > out.txt 2007년 3월 17일 토요일 오후 02시 51분 20초 $ cat out.txt // pwd만이 리다이렉트 됨 /home/sikang $ (date; ls; pwd) > out.txt $ cat out.txt // 모든 출력이 리다이렉트 됨 2007년 3월 17일 토요일 오후 02시 51분 48초 out.txt /home/sikang $_

  22. 13. 후면 처리 • 명령어 뒤에 ‘&’붙임으로써 서브 셸을 생성하여 후면처리로 실행한다. • 키보드 입력을 요구하지 않는 한, 여러 개의 작업을 동시에 수행하는데 매우 유용하다 ( 멀티 태스킹 시스템). • 실행 시간이 많이 소요되는 프로세스나 여러 작업을 동시에 수행 하는 작업에 유용하다. $ date & pwd & 19712 //pwd의 프로세스 번호 /home/sikang 19713 //date의 프로세스 번호 $ 2007년 3월 17일 토요일 오후 03시 05분 05초 $_

  23. 14.후면 프로세스의 리다이렉션 • 후면 프로세서의 출력이 자신의 터미널에 도착하는 것을 방지하기 위해서 출력을 파일에 리다이렉션 한다. $ find . -name a.c –print //전면 프로세스 ./wild/a.c ./reverse/tmp/a.c $ find . -name a.c -print & //후면 프로세스 19749 $ ./wild/a.c ./reverse/tmp/a.c date 2007년 3월 17일 토요일 오후 03시 34분 59초 $ find . -name a.c -print > find.txt & //후면 프로세스의 리다이렉션 19755 $ ls -l find.txt -rw-r--r-- 1 sikang 2007 29 3월 17일 15:36 find.txt $ cat find.txt ./wild/a.c ./reverse/tmp/a.c $_

  24. 의 미 # 현재 셸에 의해서 해석 #!pathName pathName의 셸에 의해서 해석(권장) 1,2 적용 안됨 기본 값인 bourne셸에 의해 해석된다 15.셸 프로그램 • 일련의 명령어들로 이루어진 실행 파일 → 스크립트 • 스크립트 실행 → chmod+x(실행허가권 추가)후에 실행 • 셸의 선택 : 커널은 스크립트가 어떤 셸을 대상으로 작성되었는지를 파일의 첫 번째 줄에서 결정하고, 그 후에 그 스크립트를 표준 입력으로 사용하여 셸을 실행한다. ※ #이 첫 줄이 아닌 다른 줄에서는 주석으로 간주

  25. $ cat > script.csh #!/bin/csh #c셸 스크립트의 예 echo -n the date today is # csh에서 -n은 새줄을 생략 date # 날짜 출력 $ chmod +x script.csh $ ls -l script.csh -rwxr-xr-x 1 sikang 2007 121 3월 17일 16:17 script.csh $ script.csh the date today is 2007년 3월 17일 토요일 오후 04시 20분 26초 $

  26. 16.서브 셸(Subshell) • 로그인 시, 유닉스는 초기 로그인 셸을 제공 • 입력된 단순 명령들은 초기 셸에 의해 실행 • 현재(부모) 셸이 어떤 작업을 수행 시, 자식 셸을 생성할 필요가 있다. • 서브 셸 생성이 필요한 환경 • 그룹 명령어 실행 시(부모 셸은 Sleep) • 스크립트내의 명령어 실행 시 (부모 셸은 Sleep) • 후면 작업 실행 시 (부모 셸은 실행 계속)

  27. 부모 셸 자식 셸 환경변수 환경변수 부모로부터 복사 지역변수 지역변수 초기화 • 부모 셸로부터의 변수상속 • 모든 셸은 환경변수와 지역변수를 가진다. • 자식 셸은 부모 셸의 환경변수 복사본을 얻는다. • 자식 셸은 부모 셸의 지역변수 복사본을 얻지 않고, 초기화된 지역 변수를 갖는다.

  28. $ pwd // 로그인 셸의 현재 작업 디렉토리를 표시 /home/sikang $ (cd / ; pwd) // 서브 셸 이동 후 pwd 실행 / // 서브 셸로부터의 출력 $ pwd /home/sikang $ _

  29. 이 름 의 미 $HOME 홈 디렉토리의 절대 경로 이름 $PATH 명령어를 탐색할 디렉토리 목록 $MAIL 우편함의 절대 경로 이름 $USER 사용자 ID $SHELL 로그인 셸의 절대 경로 이름 $TERM 터미널 유형 17.변수 • 환경 변수와 지역 변수 : 서브 셸은 부모 셸의 환경 변수의 복사본을 얻지만 지역 변수에 대한 복사본은 얻지 않는다. • 주요 환경 변수 목록

  30. 이 름 의 미 $$ 셸의 프로세스 id $0 셸 스크립트의 이름 $1..$9 $n은 명령어 줄의 n번째 인수를 나타냄 $* 모든 명령 줄 인수의 목록 • 변수 할당 • Bourne 셸 VariableName=Value or VariableName = “Value • C 셸 set VariableName = Value • 특별한 의미를 갖는 내장변수

  31. $ firstname=Sungin //지역변수의 설정 $ lastname=Kang $ echo $firstname $lastname //지역변수 값 확인 Sungin Kang $ export lastname //”lastname”을 환경변수로 생성 $ sh //자식 셸 시작 $ echo $firstname $lastname //변수 값 확인 Kang //지역 변수 ”firstname”는 복사되지 않음 $ ^D //자식 셸 종료 $ echo $firstname $lastname //변수 값 확인(부모 셸은 변화 없음) Sungin Kang $_

  32. $ cat script.sh #!/bin/sh echo the name of this script is $0 echo the first argument is $1 echo a list of all the arguments is $* echo this script places the date into a temporary file echo called $1.$$ date > $1.$$ #date의 출력을 리다이렉트 ls $1.$$ #파일 나열 $ script.sh paul ringo george john //스트립트 실행 the name of this script is script.sh the first argument is paul a list of all the arguments is paul ringo george john this script places the date into a temporary file called paul.19849 paul.19849 $ ls –l paul.19849 총 16 -rw-r--r-- 1 sikang 2007 43 3월 17일 17:00 paul.19849

  33. 18.인용 • ※ 인용 부호가 중첩되어 있는 경우, 바깥쪽의 인용 부호만이 효력을 가짐 $ name="Sungin Kang" $ echo 'my name is $name - date is `date`‘ // 대표문자 대치, 변수 대치, 명령 대치 금지 my name is $name - date is `date` $ echo "my name is $name - date is `date`“ //대표문자 대치만 금지 my name is Sungin Kang - date is 2007년 3월 17일 토요일 오후 07시 10분 50초 $ echo "'my name is $name - date is`date`'“ //인용부호 중첩-바깥쪽 인용 부호만 효력 'my name is Sungin Kang - date 2007년 3월 17일 토요일 오후 07시 12분 35초' $_

  34. 19.HERE DOCUMENT • <<를 사용하는 스크립트를 here document라 한다. command << word : word로 시작하는 줄의 앞줄까지의 표준 입력을 임시파일로 복사하고, 그 임시 파일의 내용을 표준 입력으로 사용하여 command를 실행

  35. $ cat here.sh mail $1 << ENDOFTEXT Dear $1, Please see me regarding some exciting news! _ $LOGNAME ENDOFTEXT echo mail sent to $1 $ here.sh sikang mail sent to sikang $ mail >N 1 Kang Sat, 17 Mar 19:24 16/423 ? 1 Message 1: From sikang Sat, 17 Mar 19:24:31 2007 Date: Sat, 17 Mar 2007 19:24:31 +0900 (KST) From: Kang <sikang> Dear sikang, Please see me regarding some exciting news! _ sikang ? q $_

  36. 20.작업제어 • 프로세서 상태 ps -aeflu -a :모든 사용자의 프로세스목록을 출력한다. -e :모든 프로세스 리스트를 출력한다. -f :프로세스 시작 시간, 프로세스의 부모 ID, 그 프로세스에 관련된 사용자 ID, 명령 이름과 가능한 매개변수(있다면) 등 모든 정보를 출력한다. -l :시스템 관리자에게 필요한 부가 정보를 출력. -u uid :지정된 사용자에 연관된 프로세스에 대한 정보를 출력한다.

  37. ps출력의 공통열 표제 $ps -f UID PID PPID C STIME TTY TIME CMD sikang 22020 22019 0 17:48 pts/0 00:00:00 -sh sikang 28272 22020 0 20:39 pts/0 00:00:00 ps -f

  38. 프로세스의 강제종료: kill : 번호가 부여된 프로세스들의 목록에 signalID라는 코드를 가진 신호를 보낸다. kill [-signalID] {pID} kill -l signalID: 디폴트는 TERM신호(signal)로써, 프로세서를 종료 시킨다. -l : 모든 시그널 이름의 목록을 제공한다. $ kill -l HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CLD PWR WINCH URG POLL STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ WAITING LWP FREEZE THAW CANCEL LOST RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX $

  39. $ (sleep 30; echo done) & 20070 $ ps PID TTY TIME CMD 20032 pts/7 0:00 sh 20071 pts/7 0:00 sleep 20070 pts/7 0:00 sh $ kill 20070 $ ps PID TTY TIME CMD 20032 pts/7 0:00 sh 20071 pts/7 0:00 sleep 20070 pts/7 0:00 sh $ kill -9 20070 $ ps PID TTY TIME CMD 20032 pts/7 0:00 sh 20070 중단됨(Killed) $ sleep 30 & sleep 30 & sleep 30 & 20075 20076 20077 $ kill 0 20077 종료됨(Terminated) 20076 종료됨(Terminated) 20075 종료됨(Terminated) $ ps PID TTY TIME CMD 20032 pts/7 0:00 sh $

  40. 21. 명령어 찾기 • 셸의 명령어 처리 • 내장명령어인가 검사 • 명령어가 /로 시작하는지를 검사 ▶ 절대 경로이름이라고 가정학 그 이름의 파일을 실행 • PATH환경변수에 이름이 저장된 디렉토리를 탐색

  41. $ date Sat Mar 31 20:09:58 EST 2007 $ echo $? 0 $ cc prog.c cc: prog.c: No such file or directory cc: no input files $ echo $? 1 $ cat script.exit echo this script returns an exit code of 3 exit 3 $ script.exit this script returns an exit code of 3 $ echo $? 3 셀 변수 $? : 항상 이전 명령의 종료 코드 값을 갖는다. exit number : 셸을 종료 시키고 그 부모 프로세스에게 종료 값인 number를 반환한다. 23.종료와 종료코드

  42. eval command : command의 결과를 정규 셀 명령으로 실행한다. exec command 셸의 프로세스가 command를 실행하는 프로세스에 의해 치환. exec를 수행한 셸은 더 이상 존재하지 않는다. shift : 모든 위치 인수 $2, …, $n을 $1, …, $(n-1)로 재명명되게 하고, $1이 없어지게 한다. 24. 공통의 핵심 내장 명령어 $ echo x=5 x=5 $ eval `echo x=5` $ echo $x 5 $ cat shift.csh #!/bin/csh echo first argument is $1, all args are $* shift echo first argument is $1, all args are $* $ shift.csh a b c d first argument is a, all args are a b c d first argument is b, all args are b c d $ shift.csh a first argument is a, all args are a first argument is , all args are $ shift.csh first argument is , all args are shift: No more words.

  43. 셸의 umask 값을 명시된 8진수 로 설정하거나, 만일 인수가 생략되면 현재의 umask값을 보여준다. 셸의 umask값은 변화될 때 까지 보존되고, 자식 프로세스에게 상속된다. 허가권의 최초설정 과정 일반파일의 초기 허가권: 666 디렉토리 파일의 초기 허가권 : 777 기본 umask 값은 022 초기 파일 허가권과 umask값을 XOR연산 umask 일반 파일의 허가권 설정 디렉토리 파일의 허가권 설정

More Related