1 / 40

제 6 장 쉘

제 6 장 쉘. 6.1 쉘 소개. 쉘 (Shell) 이란 무엇인가 ?. 쉘의 역할 쉘은 사용자와 운영체제 사이에 창구 역할을 하는 소프트웨어 명령어 처리기 (command processor) 사용자로부터 명령어를 입력받아 이를 처리한다. 쉘의 종류. 유닉스 / 리눅스에서 사용 가능한 쉘의 종류. 쉘의 종류. 본 쉘 (Bourne shell) 벨연구소의 스티븐 본 (Stephen Bourne) 에 의해 개발됨 유닉스에서 기본 쉘로 사용됨 콘 쉘 ( Korn shell)

gore
Download Presentation

제 6 장 쉘

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. 제6장 쉘

  2. 6.1 쉘 소개

  3. 쉘(Shell)이란 무엇인가? • 쉘의 역할 • 쉘은 사용자와 운영체제 사이에 창구 역할을 하는 소프트웨어 • 명령어 처리기(command processor) • 사용자로부터 명령어를 입력받아 이를 처리한다

  4. 쉘의 종류 • 유닉스/리눅스에서 사용 가능한 쉘의 종류

  5. 쉘의 종류 • 본 쉘(Bourne shell) • 벨연구소의스티븐 본(Stephen Bourne)에 의해 개발됨 • 유닉스에서 기본 쉘로 사용됨 • 콘 쉘(Korn shell) • 1980년대에는 역시 벨연구소에서 본 쉘을 확장해서 만듬. • Bash(Bourne again shell) • GNU에서 본 쉘을 확장하여 개발한 쉘 • 리눅스 및 맥 OS X에서 기본 쉘로 사용되면서 널리 보급됨 • Bash 명령어의 구문은 본 쉘 명령어 구문을 확장함 • C 쉘(C shell) • 버클리대학의 빌 조이(Bill Joy) • 쉘의 핵심 기능 위에 C 언어의 특징을 많이 포함함 • BSD 계열의 유닉스에서 많이 사용됨 • 최근에 이를 개선한 tcsh이 개발됨어 되어 사용됨

  6. 로그인 쉘(login shell) • 로그인 하면 자동으로 실행되는 쉘 • 보통 시스템관리자가 계정을 만들 때 로그인 쉘 지정 $ cat /etc/passwd | grepmysung ... mysung:x:503:503:mysung:/home/mysung:/bin/bash • 로그인 쉘 변경(리눅스) $ cat /etc/passwd | grep자기아이디 $ chsh Changing shell for mysung. 암호: New shell [/bin/bash]: /bin/csh Shell changed. $ cat /etc/passwd | grep자기아이디 또는 다시 로그인하여 % ps PID TTY TIME CMD 23750 pts/2 00:00:00 csh 23780 pts/2 00:00:00 ps

  7. 6.2 쉘의 기본 기능

  8. 쉘의 기본 기능 • 명령어 처리 • 사용자가 입력한 명령을 해석하고 적절한 프로그램을 실행 • 시작 파일 • 로그인할 때 실행되어 사용자별로 맞춤형 사용 환경 설정 • 스크립트 • 쉘 자체 내의 프로그래밍 기능 (7장)

  9. 쉘의 실행 절차

  10. 시작 파일(start-up file) • 쉘마다 시작될 때 자동으로 실행되는 고유의 시작 파일 • 주로 사용자 환경을 설정하는 역할을 하며 • 환경설정을 위해서 환경변수에 적절한 값을 설정한다 • $ 환경변수명=문자열 $ TERM=xterm $ echo $TERM xterm • export 명령어: 지역변수를 환경변수화 $ name=나가수 $ sh $ echo $name $ name=나가수; export name • 환경 변수 확인 $ env REMOTEHOST=117.16.244.61 XDG_SESSION_ID=5459 HOSTNAME=localhost.localdomain SHELL=/bin/bash TERM=ansi HISTSIZE=1000 QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt-3.3/include USER=mysung ...

  11. 시작 파일(start-up file) • 본 쉘 /etc/profile ~/.profile • bash /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc • C 쉘 /etc/.login ~/.login ~/.cshrc

  12. 시작 파일 예 • .bash_profile PATH=$PATH:$HOME/bin:. export PATH PS1="[\u@\h \w]\$ " • 시작 파일 바로 적용 $ . .bash_profile

  13. .bash_profile • 쉘 환경변수 • $HOME, $PATH, $SHELL, $TERM, $LOGNAME, $PS1, $PS2, $IFS • 프롬프트 설정 $ PS1=“$PWD \$” $ PS1=“\$PWD \$ ”  $PWD의 실행이 shell의 해석으로부터 보호되어 매 프롬프트 생성 때마다 실행 $ PS1=“\u@\h \w \$ ” $ vi .bash_profile (쉘 환경변수 PATH 및 자기 취향의 PS1 설정)  vi 편집중 문법 체크 옵션 관련 색상 없애려면:syntaxoff PATH=$PATH:$HOME/bin:. PS1=“\u@\h \w \$ ” $ . .bash_profile로 실행시켜 적용 • IFS: Input Field Separators • PS1: Prompt String 1 • PS2: Prompt String 2

  14. .bash_profile • 프롬프트에 사용할 수 있는 제어문자 \t 현재 시간(시:분:초 형식) \d 오늘 날짜, 요일(요일 월 일 형식) \n new line \s 현재 셸 이름, $0의 값 \w 현재 작업 디렉토리의 이름 (전체경로까지) \W 현재작업 디렉토리의 이름 (현재 위치만) \u 사용자 이름 \h 호스트 이름 \# 셸이 기동한 후로부터의 명령의 번호 \! 실행하는 명령의 history 번호 \$ 프롬프트 모양 uid가 0, root이면 #, 그렇지 않으면 $ \nnn ASCII 코드 nnn에 해당하는 문자 \\ 백슬래시 \[ 제어문자라 쓸 수 없는 문자를 사용하기 위해서는 [로 시작 \] 제어문자의 끝

  15. 6.3 쉘 명령어 처리

  16. 쉘 명령어 종류 • 내장 명령어 (유틸리티와의 차이: shell에 내장, search path에서 찾기 전에 실행) • 쉘 내에 내장되어 있는 명령어 • <Linux> $ man builtins • <Unix> $ man shell_builtins $ man builtins bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, compgen, complete, compopt, continue, declare, dirs, disown, echo, enable, eval, exec, exit, export, false, fc, fg, getopts, hash, help, history, jobs, kill, let, local, logout, mapfile, popd, printf, pushd, pwd, read, readonly, return, set, shift, shopt, source, suspend, test, times, trap, true, type, typeset, ulimit, umask, unalias, unset, wait $ echo {string}* $ echo–n {string}* $ echo –e “string” (예) $ echo –e "\0110\0151” • 유틸리티 프로그램 (=내장되어있지 않은 명령어들, searchpath에서찾아서 실행) • 명령어를 위한 실행 파일이 별도로 존재하는 명령어 $ ls /bin/ls • 환경변수 PATH PATH=/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/mysung/bin:.

  17. 내장 명령어 <Linux> $ manbuiltins<Unix> $man shell_builtins로 내장명령어 확인 • 정보를 표시 : echo  모든 명령어 인자(arg)들을 표준 출력(화면)에 표시해줌 • Borne shell, Bash shell에서 $ echo {string}* $ echo –n {string}*  출력에 newline을 생성(default)하지 않도록 해줌 $ echo –e “string”  제어문자 표시: 큰 따옴표 안에 표기 \b backspace \c print line without new-line (Fedora Core 15에서는 적용 안됨) \f form-feed \n new-line \r carriage return \t tab \v vertical tab \\ backslash \0n where n is the 8-bit character whose ASCII code is the 1-, 2- or 3-digit octal number representing that character (예)$ echo –e “\0101” $ echo –e “\0141” $ echo –e “\0117\n\0113”

  18. ASCIICode Unix/Linux

  19. Unix/Linux

  20. 입출력 재지정 및 파이프 • 출력 재지정 $ 명령어 > 파일 • 출력 추가 $ 명령어 >> 파일 • 입력 재지정 $ 명령어 < 파일 • 문서 내 입력 $ 명령어 << 단어 (Here Document) ... 단어 • 파이프 $ 명령어1 | 명령어2

  21. 복합 명령어 • 명령어 열(command sequence) $ 명령어1; … ; 명령어n $ date; who; pwd • 명령어 그룹(command group) $ (명령어1; … ; 명령어n) $ date; who; pwd > out1 $ (date; who; pwd) > out2

  22. 조건 명령열(conditional command sequence) • $ vi hello.c #include <stdio.h> main() { printf ("hello world!\n"); } • $ 명령어1 && 명령어2 $ gcchello.c && a.out • $ 명령어1 || 명령어2 (hello.c파일에 오류 만들고) $ gcchello.c || echo 컴파일 실패

  23. 파일 이름 대치 • 대표문자를 이용한 파일 이름 대치 • 대표문자를 이용하여 한 번에 여러 파일들을 나타냄 • 명령어 실행 전에 대표문자가 나타내는 파일 이름들로 먼저 대치하고 실행 $ cat *.c $ cat a.cb.cc.c • 대표문자 *빈 스트링을 포함하여 임의의 스트링를 나타냄 ? 임의의 한 문자를 나타냄 [..] 대괄호 사이의 문자 중 하나를 나타내며 부분범위 사용 가능 $ ls *.c $ ls [ac]*

  24. 명령어 대치(command substitution) • 명령어를 실행할 때 다른 명령어의 실행 결과를 이용 • 역따옴표(`)로 에워싼 다른 명령어 부분은 그 명령어의 실행 결과로 대치된 후에 실행 $ echo 현재 시간은 `date` $ echo 현재 디렉터리 내의 파일의 개수 : `ls | wc -w` 현재 디렉터리 내의 파일의 개수 : 32

  25. 따옴표 사용 • 따옴표를 이용하여 대치 기능을 제한 $ echo 3 * 4 = 12 3 cat.csh count.csh grade.csh invite.csh menu.csh test.sh = 12 $ echo "3 * 4 = 12" 3 * 4 = 12 $ echo '3 * 4 = 12' 3 * 4 = 12 $ name=나가수 $ echo "내 이름은 $name 현재 시간은 `date`" 내 이름은 나가수 현재 시간은 2013. 10. 21. (월) 11:47:18 KST $ echo '내 이름은 $name 현재 시간은 `date`' 내 이름은 $name 현재 시간은 `date`

  26. 따옴표 사용 • 정리 • 작은따옴표(')는 파일이름 대치, 변수 대치, 명령어 대치를 모두 제한한다 • 큰따옴표(")는 파일이름 대치만 제한한다 • 따옴표가 중첩되면 밖에 따옴표가 효력을 갖는다

  27. 6.4 쉘 스크립트

  28. 쉘 스크립트 • 쉘 스크립트는? • 명령어 및 유틸리티들을 적절히 사용하여 작성한 프로그램 • 쉘 스크립트 종류 1. 첫 번째 줄에 사용할 쉘을#!경로명 형태로 지정 #!/bin/bash #!/bin/sh #!/bin/ksh #!/bin/csh 2. 단지 첫 번째 줄이 #으로 시작되면 C쉘 스크립트로 간주 3. 그 외는 본 쉘 스크립트로 간주한다.

  29. 쉘 스크립트 작성 및 실행 • 에디터를 사용하여 스크립트 파일을 작성한다 $ vistate.bash #!/bin/bash echo –n 현재 시간: date echo 현재 사용자: who echo 시스템 현재 상황: uptime • chmod를 이용하여 실행 모드로 변경한다 $ chmod +x state.bash • 스크립트 이름을 타이핑하여 실행한 $ ./state.bash

  30. 6.5 작업 제어

  31. 프로세스 상태: ps • ps [-옵션] 명령어 • 현재 존재하는 프로세스들의 실행 상태를 요약해서 출력 $ ps PID TTY TIME CMD 25435 pts/3 00:00:00 csh 25461 pts/3 00:00:00 ps • $ ps aux (BSD 유닉스) • a: 모든 사용자의 프로세스를 출력 • u: 프로세스에 대한 좀 더 자세한 정보를 출력 • x: 더 이상 제어 터미널을 갖지 않은 프로세스들도 함께 출력 • $ ps -ef (시스템 V) • - e: 모든 사용자 프로세스 정보를 출력 • - f: 프로세스에 대한 좀 더 자세한 정보를 출력 • (cf.) $ pstree-p [ mysung ] • (cf.) $ top (display Linux tasks)

  32. kill • kill 명령어 • 현재 실행중인 프로세스를 강제로 종료 • 디폴트는 TERM(-15) • 신호는 signal()로 가로챌 수 있음 • -KILL(-9)는 절대 가로챌 수 없으므로 확실하게 종료 $ kill [-시그널] 프로세스번호 $ kill -l $ (echo 시작; sleep 5; echo 끝) & 1234 $ kill 1234 $ kill -9 1234 $ kill -KILL 1234

  33. sleep & wait • sleep 명령어 • 지정된 시간만큼 실행을 중지한다. $ sleep 초 $ (echo 시작; sleep 5; echo 끝) • wait 명령어 • 해당 프로세스 번호를 갖는 자식 프로세스가 종료될 때까지 기다린다 • 프로세스 번호를 지정하지 않으면 모든 자식 프로세스를 기다린다 • $ wait [프로세스번호] $ (sleep 50; echo done 1) & 1234 $ echo done 2; wait 1234; echo done 3 done 2 done 1 [1]+ Done ( sleep 100; echo done 1 ) done 3 다시 한번 $ (sleep 50; echo 1번 끝) & $ (sleep 50; echo 2번 끝) & $ echo done 3; wait; echo done 4 done 3 done 1 done 2 [1]- Done ( sleep 50; echo done 1 ) [2]+ Done ( sleep 50; echo done 2 ) done 4

  34. 기타 명령어 • $ nice • 프로세스의 우선순위를 조정 $ ps -l $ sleep 1000 & $ nice -n +5 sleep 1000 & $ ps -l • $ renice • 실행중인 프로세스의 우선순위를 조정 • $ id • 사용자 자신의 사용자 ID와 그룹 ID를 출력 • $ uname • 시스템정보를 출력 (-a 모든정보를 출력) • $ which echo • 쉘 명령어의 전체경로를 출력 • nohup (대부분디폴트) • 로그아웃 후에도 프로세스를 계속 실행 • 계속되기를원하지 않으면 종료 후 logout $ nohup명령어 [인수] & • 명령어의 결과는 시스템 내의 nohup.out 파일에 기록 (예) $ nohupsleep 10000 & • 디폴트임을 아래와같이확인 $ sleep 10000 & $ logout login $ ps aux | grepmysung

  35. 6.6 내장 명령어

  36. shift • shit 명령어 • 명령줄 인수를 하나씩 왼쪽으로 이동한다. • shift.sh #!/bin/sh echo firstargument is$1, all args are$* shift echo firstargument is$1, all args are$* • $ shift.sh a b c first argument is a, all args are a b c first argument is b, all args are b c

  37. eval, exit, exec, umask • eval • eval은 명령어의 출력을 쉘 명령어로 실행한다 $ echo x=5 $ echo $x $ eval`echo x=5` $ echo $x 5 • exit • 쉘을 종료하고 종료값(exit code)을 부모 프로세스에 전달한다 $ /bin/sh $ exit [종료값] $ echo $? • exec • exec는 현재 쉘을 명령어로 대치하고 명령어를 실행한다 $ exec date • umask • 파일이 생성될 때 허가권 설정을 제한하는 umask 값을 보여주거나 인수로 명시된 8진수로 설정한다 $ umask 0022 $ echo xx > xx ; ls –l xx $ umask 0066 $ echo yy > yy ; ls –l yy

  38. 핵심 개념 • 쉘은 사용자와 운영체제 사이에 창구 역할을 하는 소프트웨어로 사용자로부터 명령어를 입력받아 이를 처리하는 명령어 처리기 역할을 한다 • 입력 재지정은 명령어의 표준입력을 키보드 대신에 파일에서 받게 한다. 출력 재지정은 명령어의 표준출력을 모니터 대신에 파일에 하게 한다 • 유닉스 명령어 및 유틸리티들을 적절히 사용하여 프로그램을 작성할 수 있는데 이러한 프로그램을 쉘 스크립트라고 한다. • 쉘에서 사용할 수 있는 명령어는 쉘 내에 내장되어 있는 내장 명령어와 명령어를 위한 실행 파일이 별도로 존재하는 유틸리티 프로그램이다

  39. echo.c코딩 & 컴파일 & 실행 • echo.c코딩 #include <stdio.h> main(intargc, char *argv[]) { inti; for (i = 1; i < argc; i++) printf("%s%s", argv[i], (i < argc-1) ? " " : ""); printf("\n"); return 0; } • echo.c컴파일 & 실행 $ gccecho.c –o echo $ ./echo hello world! • [실습] 명령라인에서 $ ./myecho hello world! 실행하면 아래와 같이 출력되는 myecho.c코딩 argc=3 argv[0]=“myecho” argv[1]=“hello” argv[2]=“world!” hello world!

  40. (C언어 보충) Command-line Arguments • Command $ ./myecho hello world! • Output hello, world! • argc와argv[] • argc=3 • argv[0]=“myecho” • argv[1]=“hello” • argv[2]=“world!” • argv[3]=‘\0’ • Source code $ cat myecho.c #include <stdio.h> main(intargc, char *argv[]) { inti; for (i = 1; i < argc; i++) printf(“%s%s”, argv[i], (i< argc-1) ? “ ” : “”); printf(“\n”); return 0; } argv: myecho\0 hello\0 world!\0 0

More Related