350 likes | 600 Views
3. 유닉스 쉘. 정의 사용자와 순수 유닉스운영체제 사이에 위치하는 프로그램 쉘 (shell) 의 종류 Borune shell (sh) 가장 오랜 동안 모든 unix 시스템의 표준 구성 요소 강력한 명령 프로그래밍 언어 기능을 가짐 C shell (csh) c 언어와 유사 대화형으로 많이 사용. 3. 유닉스 쉘 ( 계속 ). Korn shell (ksh) Bourne 쉘과 완전히 호환 C 쉘의 대화형 기능 추가. 3. 유닉스 쉘 ( 계속 ). 쉘의 핵심적인 기능. 쉘.
E N D
3. 유닉스 쉘 • 정의 사용자와 순수 유닉스운영체제 사이에 위치하는 프로그램 • 쉘(shell)의 종류 • Borune shell (sh) • 가장 오랜 동안 모든 unix시스템의 표준 구성 요소 • 강력한 명령 프로그래밍 언어 기능을 가짐 • C shell (csh) • c 언어와 유사 • 대화형으로 많이 사용
3. 유닉스 쉘 (계속) • Korn shell (ksh) • Bourne쉘과 완전히 호환 • C쉘의 대화형 기능 추가
3. 유닉스 쉘 (계속) • 쉘의 핵심적인 기능 쉘 내장명령어 스크립트 변수 리다이렉션 대표문자 파이프 명령열 서브쉘 후면처리 명령어처리 지역 환경 조건부 무조건부
3. 유닉스 쉘 (계속) • 쉘의 선택 시스템 관리자가 사용자의 기본 쉘을 정한다. • $ : Bourne 쉘 또는 Korn 쉘 • %: C 쉘
3. 유닉스 쉘 (계속) • 쉘 명령 • 단일 명령어 • 다중 명령어 • 순차 수행 • 동시수행 # command1& command2& command3&……. command N # command [인 수] # command 1; command 2; …………; command N
3. 유닉스 쉘 (계속) • 메타 문자 • 쉘이 특수하게 처리하는 문자 • 메타 문자의 특수한 의미를 없애기 위해서는 앞에 ‘\’를 삽입한다. # echo hi > file // echo의 출력을 file에 저장 # cat file // file의 내용 보기 hi # echo hi \> file // 메타 문자 금지 hi > file # _
3. 유닉스 쉘 (계속) • 리다이렉션(Redirection) • 출력 리다이렉션 프로세스의 출력을 파일에 저장할 수 있게 한다. command > filename // command의 표준 출력을 filename파일로 보낸다. command >> filename //command의 표준 출력을 filename이라는 파일의 끝에 덧붙인다.
3. 유닉스 쉘 (계속) # 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. # _
3. 유닉스 쉘 (계속) • 입력 리다이렉션 파일의 내용을 표준 입력으로 사용하는 리다이렉션 command < filename // filename내용을 표준 입력으로 사용하여 command를 실행 command << word // word로 시작하는 줄의 앞줄까지의 표준 입력을 임시파일로 복사하고, 그 임시 파일의 내용을 표준 입력으로 사용하여 command를 실행
3. 유닉스 쉘 (계속) # mail james < mail.text // 자신에게 메일 전송 # mail // 메일 확인 mailx version 5.0 Tue Jul 15 21:29:48 PDT 1997 도움말 필요시 ? 입력. "/var/mail/s95699": 1개 메시지 1개 신규 >N 1 s95699 Sun Jul 18 16:08 15/381 // 전송된 메일 ?
대표 문자 의 미 * 빈 문자열을 포함하는 어떤 문자열과도 일치. ? 어떤 단일 문자와 일치. [..] 대괄호 사이의 어떤 하나의 문자와 일치. 문자의 범위는 대시(-)기호로 문자의 쌍을 분리하 여 지정 가능하다. 3. 유닉스 쉘 (계속) • 파일 이름 대치(대표 문자) 모든 쉘은 파일 시스템에서 특정한 이름 패턴을 만족하는 파 일을 선택할 수 있게 대표 문자 기능을 지원한다.
3. 유닉스 쉘 (계속) # 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 [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
3. 유닉스 쉘 (계속) • 파이프 (Pipe) command1 | command2 // command1의 표준 출력을 command2의 표준 입력으로 사용 command1 command2 터미널 파이프 # ls // 현재 디렉토리 표시 a.c b.c cc.c # ls | wc -w // 엔트리의 수 표시 5 # _
ls Wc -w 터미널 파이프 3. 유닉스 쉘 (계속) # ls // 현재 디렉토리 표시 a.c b.c cc.c # ls | wc -w // 엔트리의 수 표시 3 # _
터미널 cat sort 파이프 3. 유닉스 쉘 (계속) # cat userid | sort glass james john kang tim # cat userid james glass kang tim john
tee -ia {filename} -i: 인터럽트를 무시한다. -a: 입력을 파일에 덮어씌우지 않고 대신에 그 파일의 끝에 덧붙인다. 3. 유닉스 쉘 (계속) • 파이프라인의 분리: tee 파이프의 결과를 파일에 복사하고, 계속 파이프라인을 따라 흐르 게 하는 기능
3. 유닉스 쉘 (계속) # who | tee who.txt | sort // tee를 이용하여 파이프 자료 복사 James pts/6 5월 24 11:19 root console 5월 22 13:56 root pts/3 5월 22 13:57 root pts/4 5월 22 13:57 # cat who.txt // who.txt 파일 보기 root console 5월 22 13:56 James pts/6 5월 24 11:19 root pts/3 5월 22 13:57 root pts/4 5월 22 13:57 # _
3. 유닉스 쉘 (계속) • 명령열 (Sequences) • ‘ ;’으로 명령어를 구분한다. • 쉘은 왼쪽에서 오른쪽으로 차례로 실행한다. • 출력결과는 반드시 순서적 이지는 않다. # date; pwd; ls 1999년 5월 24일 월요일 오전 11시 46분 27초 /user/james/ a.c b.c cc.c # date > date.txt; ls; pwd > pwd.txt //첫번째와 세번째 명령을 리다이렉트 a.c b.c cc.c date.txt # cat date.txt 1999년 7월 18일 일요일 오후 04시 28분 46초 # cat pwd.txt /stud/users/james
3. 유닉스 쉘 (계속) • 조건부 실행 순서 • 모든 유닉스 프로세스는 종료 값을 가지고 끝난다. • 종료 값이 0이면 프로세스가 성공적으로 완결되었음을 의미 &&: 이전 명령의 종료 값으로 0을 반환할 경우만 다음 명령이 실행된다. || : 이전 명령의 종료 값으로 0이 아닌 값을 반환 할 경우만 다음 명령이 실행된다. # cc myprog.c && a.out // myprog.c가 성공적으로 컴파일 될 경우, a.out을 실행한다. # cc myprog.c || echo compile error // myprog.c가 실패할 경우만 다음 명령을 실행한다.
3. 유닉스 쉘 (계속) • 명령어 그룹 (Instruction group) 명령어들을 괄호 안에 그룹으로 묶어, 이를 하나의 자식 쉘에서 실행하게 한다. # date; ls; pwd > out.txt 1999년 5월 24일 월요일 오후 12시 19분 01초 // date의 출력 a.c b.c cc.c // ls의 출력 # cat out.txt /user/james// pwd만이 리다이렉트 됨 # (date; ls; pwd) > out.txt // 그룹으로 묶고 리다이렉트 실행 # cat out.txt // 모든 출력이 리다이렉트 됨 1999년 5월 24일 월요일 오후 12시 19분 01초 a.c b.c cc.c /user/james # _
3. 유닉스 쉘 (계속) • 후면 처리(Background Processing) • 명령어 뒤에 ‘&’ 붙임으로써 서브 쉘을 생성하여 후면처리로 실행한다. • 키보드 입력을 요구하지 않는 한, 여러 개의 작업을 동시에 수행하는데매우 유용하다 ( 멀티 태스킹 시스템). # date & pwd & 4510 //date의 프로세스 번호 4511 //pwd의 프로세스 번호 1999년 5월 24일 월요일 오후 12시 43분 03초 //date의 출력 /user/james //pwd의 출력 # _
3. 유닉스 쉘 (계속) • 후면 프로세스의 리다이렉션 • 후면 프로세서의 출력이 자신의 터미널에 도착하는 것을 방지하기 위해서 출력을 파일에 리다이렉션 한다. # find . - name a.c -print > find.txt & // 후면 프로세서의 생성 27188 // find 의 프로세서 id # ls -l find.txt -rw-r-- r-- 1 james 0 Feb 3 18:11 find.txt # ls -l find.txt // 파일의 크기가 커짐 -rw-r-- r-- 1 james 29 Feb 3 18:11 find.txt # cat find.txt ./wild/a.c ./reverse/tmp/a.c # _
쉘 의 미 #, #! /bin/csh C쉘에 의해 해석된다 #! /bin/ksh korn쉘에 의해 해석된다 #! /bin/sh bourne쉘에 의해 해석된다 3. 유닉스 쉘 (계속) • 쉘 프로그램 일련의 명령어들로 이루어진 실행 파일 • 쉘의 선택 커널은 스크립트가 어떤 쉘을 대상으로 작성되었는지를 파일의 첫번째 줄에서 결정하고, 그 후에 그 스크립트를 표준 입력으로 사용하여 쉘을 실행한다.
3. 유닉스 쉘 (계속) # cat > ex_sh # this is a example //c쉘로 해석 echo hi // hi를 표준 출력 date // 현재 날짜출력 ^D // 입력의 끝 # chmod +x ex_sh // ex_sh파일에 실행 허가권 부여 # ex_sh hi 1999년 3월 10일 수요일 오후 07시 08분 40초 # _
3. 유닉스 쉘 (계속) • 서브 쉘(Subshell) • 로그인 시, 유닉스는 초기 로그인 쉘을 제공 • 입력된 단순 명령들은 초기 쉘에 의해 실행 • 현재(부모) 쉘이 어떤 작업을 수행 시, 자식 쉘을 생성할 필요가 있다. • 서브 쉘 생성이 필요한 환경 • 그룹 명령어 실행 시 • 스크립트내의 명령어 실행 시 • 후면 작업 실행 시
3. 유닉스 쉘 (계속) • 부모 쉘로부터의 변수상속 • 모든 쉘은 환경변수와 지역변수를 가진다. • 자식 쉘은 부모 쉘의 환경변수 복사본을 얻는다. • 자식 쉘은 부모 쉘의 지역변수 복사본을 얻지 않고, 초기화된 지역 변수를 갖는다. 부모 쉘 자식 쉘 환경변수 환경변수 부모로부터 복사 지역변수 지역변수 초기화
3. 유닉스 쉘 (계속) # pwd // 로그인 쉘의 현재 작업 디렉토리를 표시 /usr/james # (cd / ; pwd) // 서브 쉘 이동 후 pwd 실행 / // 서브 쉘로부터의 출력 # pwd /usr/james # _
3. 유닉스 쉘 (계속) • 변수 서브 쉘은 부모 쉘의 환경 변수의 복사본을 얻지만 지역 변수에 대한 복사본은 얻지 않는다. • 주요 환경 변수 목록 이 름 의 미 $HOME 홈 디렉토리의 절대 경로 이름 $PATH 명령어를 탐색할 디렉토리 목록 $MAIL 우편함의 절대 경로 이름 $USER 사용자 ID $SHELL 로그인 쉘의 절대 경로 이름 $TERM 터미널 유형
3. 유닉스 쉘 (계속) • 환경 변수 목록 보기: env # env HOME=/user/james PATH=/bin:/usr/bin:/usr/ucb:/etc:. LOGNAME=james HZ=100 TZ=ROK SHELL=/bin/csh MAIL=/var/mail/james LANG=ko TERM=ansi PWD=/user/james USER=james # _
3. 유닉스 쉘 (계속) • 변수 할당 • Bourne 쉘과 Korn 쉘 VariableName = Value • C 쉘 set VariableName = Value # set firstname = Graham // 지역 변수 설정 # set lastname = glass // 또 다른 지역 변수 설정 # echo $firstname $lastname // 변수들의 값 표시 Graham glass # _
이 름 의 미 $$ 쉘의 프로세스 id $0 쉘 스크립트의 이름 $1..$9 $n은 명령어 줄의 n번째 인수를 나타냄 $* 모든 명령 줄 인스의 목록 3. 유닉스 쉘 (계속) • 특별한 의미를 갖는 내장변수
3. 유닉스 쉘 (계속) # cat > script.csh // 스크립트 파일 생성 # this is a sample C shell script. // C쉘에 의해 해석 echo the name of this script is $0 // 쉘 스크립트 이름 출력 echo the first argument is $1 // 명령어 줄의 첫번째 인수 출력 echo a list of all the arguments is $* // 모든 명령 줄 인수의 목록 출력 ^C # chmod +x script.csh // 실행 허가권 부여 # script.csh james glass june the name of this script is script.csh the first argument is james a list of all the arguments is james glass june # _
3. 유닉스 쉘 (계속) • 작업 제어 • 프로세서 상태 ps -aefptu -a :모든 사용자의 프로세스목록을 출력한다. -e :모든 프로세스 리스트를 출력한다. -f :프로세스 시작 시간, 프로세스의 부모 ID, 그 프로세스에 관련된 사용자 ID, 명령 이름과 가능한 매개변수(있다면) 등 모든 정보를 출력한다. -p pid :지정된 프로세스에 대한 정보를 출력한다. -t tty :지정된 터미널에 연관된 프로세스에 대한 정보를 출력한다. -u uid :지정된 사용자에 연관된 프로세스에 대한 정보를 출력한다.
3. 유닉스 쉘 (계속) # ps -u // 사용자 지향적 출력 요청 USER PID %CPU %MEM SZ RSS TT S START TIME COMMAND s95699 12685 0.0 0.2 1560 1328 pts/10 S 16:06:45 0:00 -csh # ps -a // 모든 사용자의 프로세서를 표시 PID TT S TIME COMMAND 958 console S 0:00 /usr/lib/saf/ttymon -g -h -p ce console login: -T sun 1039 pts/2 S 0:01 [ sdt_shell ] 1042 pts/2 S 0:00 [ csh ] 1061 pts/2 S 0:08 /usr/dt/bin/dtsession 1078 pts/3 S 0:00 /bin/csh 1082 pts/4 S 0:00 /bin/csh 13122 pts/9 S 0:00 -csh 12685 pts/10 S 0:00 -csh 14188 pts/10 O 0:00 ps -a 13199 pts/12 S 0:00 -csh # _
3. 유닉스 쉘 (계속) • 프로세스의 강제종료: kill 번호가 부여된 프로세스들의 목록에 signalID라는 코드를 가진 신호 을 보낸다. kill [-signalID] {pID} kill -l signalID: 디폴트는 TERM신호(signal)로써, 프로세서를 종료 시킨다. -l : 모든 시그널 이름의 목록을 제공한다. # (sleep 10; echo done)& 2497 # kill 2497 종료됨(Terminated) ( sleep 10; echo done ) # _