3. 유닉스 셸 (Unix Shell) 실습 컴퓨터 : fedora.incheon.ac.kr (117.16.244.59) multi.incheon.ac.kr (117.16.244.53) gnu.incheon.ac.kr (117.16.244.55) PC multibooting 에서 Linux booting 윈도우 ‘시작’ 메뉴‘실행’ 선택해서 telnet 117.16.244.59 telnet 117.16.244.53 login: s1234567 passwd: ******
유닉스 셸 (Unix Shell) 명령어 및 유틸리티 리스트 echo cd eval exec shift umask tee find grep ps kill wait
소개 유닉스 셀(Unix Shell) Unix Shell의 종류: 대표적인 3종류의 Shell 대표 문자, 입출력 리다이렉션, 다중 작업(multi-tasking), 파이프와 같은 기본 기능들을 쉽게 사용할 수 있음 Unix Shell의 종류: 대표적인 3종류의 Shell Bourne Shell Bash Shell (Bourn-Again Shell)로 진화 Stephen Bourne이 제작, 최초의 대중화된 Unix Shell Korn Shell Z Shell로 진화 David Korn이 제작, Bourne Shell보다 포괄적, 산업체에서 선호, 유망 C Shell TC Shell로 진화 Bourne Shell 후에 작성됨, C 언어와 밀접한 구조와 관계 모든 로그인 사용자 공통 메시지: /etc/motd Unix/Linux
소개 Bourne Shell (Steven Bourne, AT&T) Bash Shell (Bourn-Again Shell) /bin/sh $ .profile (실행은 $ . .profile) 프로그래밍 기능 C Shell (Bill Joy, Berkeley) TC Shell /bin/csh % .login .cshrc (실행은 % source .cshrc) Bourne shell + (대화형 명령입력 + 별명(alias) + history) Korn Shell (Dave Korn) Z Shell /bin/ksh Bourne shell + C shell Bourne-Again Shell /bin/bash .bash_profile .bashrc .bash_logout (.bash_login은 호출 않음) Bourne shell + (강력한 스크립팅 기능 + C 셸과 Korn 셸의 유용한 기능 결합) Unix/Linux
.bash_profile 셸 환경변수: $HOME, $PATH, $SHELL, $TERM, $LOGNAME, $PS1, $PS2, $IFS 프롬프트 설정 PS1=“$PWD \$” PS1=“\$PWD \$” ($PWD의 실행이 shell의 해석으로부터 보호되어 매 프롬프트 생성 때마다 실행됨) PS1=“\u@\h \w \$” $ vi .bash_profile 안에 자기 취향의 PS1 설정하고 $ . .bash_profile로 실행시켜 적용 프롬프트에 사용할 수 있는 제어문자 \t 현재 시간(시:분:초 형식) \d 오늘 날짜, 요일(요일 월 일 형식) \n new line \s 현재 셸 이름, $0의 값 \w 현재 작업 디렉토리의 이름 (전체경로까지) \W 현재 작업 디렉토리의 이름 (현재 위치만) \u 사용자 이름 \h 호스트 이름 \# 셸이 기동한 후로부터의 명령의 번호 \! 실행하는 명령의 history 번호 \$ 프롬프트 모양 uid가 0, root이면 #, 그렇지 않으면 $ \nnn ASCII 코드 nnn에 해당하는 문자 \\ 백슬래시 \[ 제어문자라 쓸 수 없는 문자를 사용하기 위해서는 [로 시작 \] 제어문자의 끝 Unix/Linux
셸의 기능 셸 기능 내장명령어 스크립트 변수 리다이렉션 대표문자 파이프 명령열 서브셸 후면처리 명령어치환 지역 환경 조건부 무조건부 Unix/Linux
셸 선택 계좌 개설시 선택 명시 /etc/passwd 화일 안에 login shell 정보 저장 $ echo $SHELL 현재 실행 중인 shell이 무엇인지를 확인하는 법 $ ps Shell 호출 및 환경 설정 ① 자동 호출 login시에 특정 시작 화일을 읽어서 shell을 시작 Bourne Shell : .profile C Shell : .login, .cshrc Korn Shell : .profile Bourne-Again Shell : .bash_profile, .login, .bashrc ② 수동 호출 /bin/sh: . .profile /bin/csh: source .cshrc /bin/ksh: . .profile /bin/bash: . .bash_profile Unix/Linux
셸 운영 기본적인(공통적인) shell 기능 다수의 내장 명령어 제공 메타문자 제공 입력/출력/오류의 redirection 기능 제공 대표문자들(wildcards)를 이용하여 화일이름 대치 파이프라인 기능 명령어 대치 조건부/무조건부 명령열(sequences) 작성 subshell 생성 후면처리(background processing) Shell Script(프로그램)를 작성할 수 있도록 해줌 환경변수와 지역변수를 가짐 인용(quoting) 작업 제어 Unix/Linux
실행 가능한 파일과 내장 명령어 다수의 내장 명령어 제공 <Linux machine> $ man builtins <Unix machine> $ man shell_builtins 로 내장명령어 확인 (cf.) utility program과의 차이: shell에 내장, search path에서 찾기 전에 실행 정보를 표시 : 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” Unix/Linux
ASCII Code Unix/Linux * 1 2 3 4 5 6 7 8 9 A B C D E F NUL SOH STX ETX 1 2 3 4 5 6 7 8 9 A B C D E F NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US ! " # $ % & ' ( ) + , - . / : ; < = > ? @ G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ Unix/Linux
Unix/Linux 10진수 16진수 8진수 2진수 ASCII 0×00 000 0000000 NULL 64 0×40 100 0×00 000 0000000 NULL 64 0×40 100 1000000 @ 1 0×01 001 0000001 SOH 65 0×41 101 1000001 A 2 0×02 002 0000010 STX 66 0×42 102 1000010 B 3 0×03 003 0000011 ETX 67 0×43 103 1000011 C 4 0×04 004 0000100 EOT 68 0×44 104 1000100 D 5 0×05 005 0000101 ENQ 69 0×45 105 1000101 E 6 0×06 006 0000110 ACK 70 0×46 106 1000110 F 7 0×07 007 0000111 BEL 71 0×47 107 1000111 G 8 0×08 010 0001000 BS 72 0×48 110 1001000 H 9 0×09 011 0001001 HT 73 0×49 111 1001001 I 10 0×0A 012 0001010 LF 74 0×4A 112 1001010 J 11 0×0B 013 0001011 VT 75 0×4B 113 1001011 K 12 0×0C 014 0001100 FF 76 0×4C 114 1001100 L 13 0×0D 015 0001101 CR 77 0×4D 115 1001101 M 14 0×0E 016 0001110 SO 78 0×4E 116 1001110 N 15 0×0F 017 0001111 SI 79 0×4F 117 1001111 O 16 0×10 020 0010000 DLE 80 0×50 120 1010000 P 17 0×11 021 0010001 DC1 81 0×51 121 1010001 Q 18 0×12 022 0010010 SC2 82 0×52 122 1010010 R 19 0×13 023 0010011 SC3 83 0×53 123 1010011 S 20 0×14 024 0010100 SC4 84 0×54 124 1010100 T 21 0×15 025 0010101 NAK 85 0×55 125 1010101 U 22 0×16 026 0010110 SYN 86 0×56 126 1010110 V 23 0×17 027 0010111 ETB 87 0×57 127 1010111 W 24 0×18 030 0011000 CAN 88 0×58 130 1011000 X 25 0×19 031 0011001 EM 89 0×59 131 1011001 Y 26 0×1A 032 0011010 SUB 90 0×5A 132 1011010 Z 27 0×1B 033 0011011 ESC 91 0×5B 133 1011011 [ 28 0×1C 034 0011100 FS 92 0×5C 134 1011100 \ 29 0×1D 035 0011101 GS 93 0×5D 135 1011101 ] 30 0×1E 036 0011110 RS 94 0×5E 136 1011110 ^ 31 0×1F 037 0011111 US 95 0×5F 137 1011111 _ 32 0×20 040 0100000 SP 96 0×60 140 1100000 . 33 0×21 041 0100001 ! 97 0×61 141 1100001 a 34 0×22 042 0100010 " 98 0×62 142 1100010 b 35 0×23 043 0100011 # 99 0×63 143 1100011 c 36 0×24 044 0100100 $ 0×64 144 1100100 d 37 0×25 045 0100101 % 0×65 145 1100101 e 38 0×26 046 0100110 & 0×66 146 1100110 f 39 0×27 047 0100111 ' 0×67 147 1100111 g 40 0×28 050 0101000 ( 0×68 150 1101000 h 41 0×29 051 0101001 ) 0×69 151 1101001 i 42 0×2A 052 0101010 * 0×6A 152 1101010 j 43 0×2B 053 0101011 + 0×6B 153 1101011 k 44 0×2C 054 0101100 108 0×6C 154 1101100 l 45 0×2D 055 0101101 - 109 0×6D 155 1101101 m 46 0×2E 056 0101110 0×6E 156 1101110 n 47 0×2F 057 0101111 / 0×6F 157 1101111 o 48 0×30 060 0110000 0×70 160 1110000 p 49 0×31 061 0110001 0×71 161 1110001 q 50 0×32 062 0110010 0×72 162 1110010 r 51 0×33 063 0110011 0×73 163 1110011 s 52 0×34 064 0110100 0×74 164 1110100 t 53 0×35 065 0110101 0×75 165 1110101 u 54 0×36 066 0110110 118 0×76 166 1110110 v 55 0×37 067 0110111 119 0×77 167 1110111 w 56 0×38 070 0111000 0×78 170 1111000 x 57 0×39 071 0111001 0×79 171 1111001 y 58 0×3A 072 0111010 : 0×7A 172 1111010 z 59 0×3B 073 0111011 ; 0×7B 173 1111011 { 60 0×3C 074 0111100 < 0×7C 174 1111100 | 61 0×3D 075 0111101 = 0×7D 175 1111101 } 62 0×3E 076 0111110 > 0×7E 176 1111110 ~ 63 0×3F 077 0111111 ? 0×7F 177 1111111 DEL Unix/Linux
실행 가능한 파일과 내장 명령어 다른 내장 명령어 예제 : cd, eval, exec, shift, umask $ eval `command` backquote, grave accent(‘)안의 command 수행 결과를 정규 셀 명령으로 간주하여 실행 (Bash shell 예) $ echo x=5 와 $ echo $x $ eval `echo x=5` 의 차이점 $ exec command 현재의 shell process가 command를 수행하는 shell process로 대치됨 따라서 command가 성공적으로 수행되면, exec process는 사라짐 특히, exec의 process가 login shell이면, logout 되어버림 (시스템 호출 fork + exec 참조) (예)$ exec date Unix/Linux
실행 가능한 파일과 내장 명령어 $ shift 명령어 인자들의 위치를 왼쪽으로 하나씩 옮김, 첫 번째 인자 ($1)은 없어지므로 이동할 명령어 인자가 없으면 에러 메시지가 나옴 (예)$ cat shift.sh (또는 shift.bash) [교재 p156 참조] #! /bin/sh (또는 /bin/bash) echo first argment is $1, all args are $* shift $ shift.sh a b c d echo first argment is a, all args are a b c d echo first argment is b, all args are b c d Unix/Linux
실행 가능한 파일과 내장 명령어 $ umask (user mask) [8진수] 화일 생성시, 이에 대한 접근에 관한 허가권에 대하여 masking을 수행 default 값: 0022 (그룹과 다른 사람들에 대하여 쓰기 금지) masking(가림)의 원칙 (예)fd = open("myFile", O_CREAT | O_RDWR, 0666) -rw-r--r-- (0644) $ umask 현재의 마스크 값을 인쇄해줌 $ umask 0 no masking -rw-rw-rw-(0666) Unix/Linux
메타 문자 http://www.itdaily.kr/news/articleView.html?idxno=22497 의 미 기호 word 바로 전줄까지를 임시 화일에 저장한 후 이 화일을 표준입력으로 읽어 들이는 입력 redirection here document <<을 사용하는 script를 말합 의 미 기호 의 미 > >> < <<word 표준출력을 파일에 저장하는 출력 redirection 표준출력을 파일에 추가 저장하는 출력 redirection 표준입력을 파일에서 읽어 들이는 입력 redirection ; || Shell 명령어를 순서대로 구분 하여 나열할 때 사용하는 분리자 && \ 이전의 명령이 실패하면 실행 하도록 하는 조건부 명시 이전의 명령이 성공하면 실행하도록 하는 조건부 명시 Shell의 메타문자 앞에 붙어서 메타문자의 특수 의미를 제거함 $ echo hi > file $ echo hi \> file Unix/Linux
메타 문자 기호 의 미 기호 의 미 0개 이상의 문자와 일치 하는 화일 치환 대표 문자 그룹 명령어 * (...) 의 미 기호 의 미 0개 이상의 문자와 일치 하는 화일 치환 대표 문자 그룹 명령어 * (...) 단일 문자와 일치하는 화일 치환 대표 문자 후면 실행 (background processing) & ? [ 와 ] 사이의 어떤 문자 와도 일치하는 화일 치환 대표 문자. 문자의 범위는 대쉬(-)로 표현 Newline까지를 설명문으로 간주하여 처리함 [...] # 명령어 command의 출력 에 의해서 대치 되는 명령 어 치환 $ 변수 접근 `command` 어떤 프로세스의 출력을 다른 프로세스의 입력으로 보내 주는 pipe | Unix/Linux
리다이렉션 Redirection 표준 파일들 표준 입력 (standard input) : fd (file descriptor) = 0 표준 출력 (standard output) : fd = 1 표준 에러 (standard error) : fd = 2 출력/입력/에러 Redirection : 메타문자표 참조 $ cat > test.txt ......... ^D # 출력 redirection(생성): 존재하면 truncate (overwrite) # $ set –o noclobber 또는 $ set –C 로 truncate 방지 # $ set +o noclobber 또는 $ set +C 로 truncate 회복 $ cat >> test.txt ......... ^D # 출력 redirection(추가) $ mail mysung < letter # 입력 redirection Unix/Linux
리다이렉션 #표준에러를 표준출력에 연계 시킴(표준출력과 표준에러를 한 파일에) $ cat here.sh #here document #EndOfMail의 직전 줄까지 읽어서 메일 내용으로 보냄 mail $1 << EndOfMail Dear $1, Good Morning! -from $LOGNAME Have a nice day! EndOfMail #공백 없이 첫째 칸부터 입력 echo mail sent to $1 $ here.sh mysung mail sent to mysung 표준 에러 처리 Borne 셸, Bash 셸 $ find / -perm 4755 –ls > find.txt #표준출력을 find.txt라는 화일에 redirection $ find / -perm 4755 –ls > find.txt 2> err.txt #표준에러를 err.txt라는 화일에 redirection $ find / -perm 4755 –ls > find.txt 2>&1 #표준에러를 표준출력에 연계 시킴(표준출력과 표준에러를 한 파일에) Unix/Linux
화일 이름 대치 (wildcards) Wildcard들을 이용한 화일 이름 대치 $ ls -FR a.c b.c cc.c dir1/ dir2/ dir1: d.c e.e dir2: f.d g.c 교재 p126 예제 $ ls *.c a.c b.c cc.c $ ls ?.c a.c b.c $ ls [ac]* a.c cc.c $ ls [A-Za-z]* a.c b.c cc.c $ ls dir*/*.c dir1/d.c dir2/g.c $ ls *2/?.? ?.? a.c b.c dir2/f.d dir2/g.c Unix/Linux
파이프(pipes) 표준 입력을 명시된 화일과 표준 출력에 동시 복사 -a (화일에 추가 저장) -i (인터럽트 무시) 파이프라인 기능 $ command1 | command2 | command3 $ ls | wc -w $ ls -l | wc -l $ who | tee who.capture | sort #who의 출력을 화일에 복사 저장한 후 이를 정렬함 tee -ia {fileName}+ 표준 입력을 명시된 화일과 표준 출력에 동시 복사 -a (화일에 추가 저장) -i (인터럽트 무시) cat /etc/passwd | awk –F: ‘{ print $1 }’ | sort Awk(Aho, Weinberger, Kernighan)는 [교재 221 참조] Unix/Linux
명령어 대치 그레이브 액센트 부호(`)로 둘러싸인 명령어는 표준 출력으로 대치 $ echo the date today is `date` $ echo there are `who | wc -l` users on the system $ vi `grep -l debug *.c` # debug 패턴을 포함하며 .c로 끝나는 모든 화일들을 vi 편집 grep, fgrep, egrep: 명시된 패턴이 있는/없는 줄만을 여과 화일 여과 utility [교재 p193 참조] grep/frep/egrep - hilnvw pattern {fileName}* -n (줄번호 표시) -i (대소문자 무시) -l (화일목록) -v (일치하지 않는 줄) -w (단어 단위로 탐색) 명시된 화일이 없으면 표준 입력을 탐색한다. pattern : grep (정규식) fgrep (일정한 문자열만) egrep (확장된 정규식) (예)$ grep the rain (예)$ grep rain rain (예)$ grep -nw rain rain Unix/Linux
명령열(sequences) 조건부/무조건부 실행 순서 (무조건부) 명령열(sequence) 세미콜론(;)으로 구성됨, 순차적으로 수행 (예) $ date > date.txt ; ls ; pwd > pwd.txt 프로세스의 종료 값 반환 0(성공적 완성), 0 아닌 값(수행 실패) Bourne shell과 Korn shell 프로세스의 종료 값 표시: $? [p147 참조] (예) $ date; echo $? 0 (cf.) C shell 프로세스의 종료 값 표시: $status에 (예) % date; echo $status 0 셀을 종료시키고 부모 프로세스에 종료 값 전달 $ exit number (예) $ exit 3 (조건부) 프로세스의 종료 값 이용 && (이전 명령의 종료 값이 0이면, 다음 명령 계속 수행) || (이전 명령의 종료 값이 0이 아니면, 다음 명령 계속 수행) (예) $ gcc myprog.c && a.out (예) $ gcc myprog.c || echo compilation failed Unix/Linux
명령어 그룹 Subshell(자식 셸) 명령어 그룹 수행 시, 부모 셸이 자식 셸을 생성 (예) $ (date ; ls ; pwd) > output.txt cf. date ; ls ; pwd > output.txt 스크립트가 실행될 때, 부모 셸이 자식 셸을 생성 후면 작업이 실행될 때, 부모 셸이 자식 셸을 생성함 자식 셸은 부모 셸로부터 환경 공간과 지역변수 공간의 복사본을 상속 받음 Unix/Linux
후면 처리 (Background Processing) & 후면 프로세서의 리다이렉션 & 자식셸로 생성되어 부모 셸과 같이 수행되나 키보드를 제어하지 않음 (예) % find . -name ‘*.c’ -print & [p214 참조] (cf.) find . -name ‘*.c’ -print % date (예) % date & pwd & Bourne, Bash 셸의 후면처리의 출력 리다이렉션 (예) % find / -name b.c -print > find.txt & (예) % find / -name b.c -print > find.txt 2>&1 & (에러 메시지도 함께) (예) % find / –name b.c -print > find.txt 2> err.txt (따로 따로) 후면처리의 입력 리다이렉션 키보드 입력시 에러 시그널을 내고 종료됨 (예) % mail mysung & ...... 중단됨(종료) Unix/Linux
셸 프로그램 : Scripts & 서브셸(Subshell) Shell Script(프로그램)를 작성할 수 있도록 해 줌 Script 셀 명령들을 포함하는 화일로서, chmod +x가 적용되어야 함 셸 선택(script의 첫 줄에 명시) 첫 줄이 # : 스크립트를 수행한 셸(현재 셸)에 의해 해석 #! shell의 path (예) #! /bin/bash : 해당 셸 3.16 서브셸(Subshell) 3.11 명령열 참조 Unix/Linux
변수 환경변수와 지역변수 공통적인 환경변수 공통적인 지역변수 의 미 이 름 $HOME $PATH $LOGNAME $SHELL 의 미 이 름 $HOME $PATH $LOGNAME $SHELL $TERM 홈디렉토리의 절대경로이름 사용자 id 명령어 탐색 디렉토리 목록 로그인의 셀의 절대경로이름 mailbox의 절대경로 이름 터미널의 유형 $MAIL (예) echo LOGNAME = $LOGNAME, SHELL = $SHELL, TERM = $TERM Unix/Linux
변수 공통적인 지역변수 의 미 이 름 $$ $0 $1..$n $* 셀의 프로세스 id 명령어 n번째 인수 셀 스크립트 이름 의 미 이 름 $$ $0 $1..$n $* 셀의 프로세스 id 명령어 n번째 인수 셀 스크립트 이름 명령어 모든 인수 목록 (예)$ cat variable.bash (또는 variable.csh 모든 종류의 셸에서 정상 동작) date > $1.$$ echo '$$ = ' $$ echo '$0 = ' $0 echo '$1.$$ = ' $1.$$ cat $1.$$ $ variable.bash Sung MeeYoung Sung.1234 $ cat Sung.1234 Unix/Linux
인용(Quoting) & HERE DOCUMENTS 셸의 대표문자 대치, 변수 대치, 명령 대치 등을 금지할 때 단일 인용 부호(') 사용 셸의 대표문자 대치만을 금지할 때 이중 인용 부호(") 사용 인용 부호가 중첩되어 있는 경우, 바깥쪽의 인용 부호만이 효력을 가짐 (예) $ echo 3 * 4 = 12 3 file1 file2 file3 4 = 12 (예) $ echo "3 * 4 = 12" 3 * 4 = 12 (예) $ name=mysung (본 셸) C shell 에서는 # set name=mysung $ echo "My name is $name" My name is mysung $ echo 'My name is $name' My name is $name 3.19 HERE DOCUMENTS 3.7 리다이렉션 참조 Unix/Linux
작업 제어: ps (Unix) 프로세스 상태 : ps ps –[aefglu] (Unix 출력) -a all (단말기에서 제어하는) -e everything (단말기에서 제어하지 않는 것도) -f full listing -l long -u user (예) $ ps -ef (Unix 출력) UID PID PPID C STIME TTY TIME CMD root 0 0 0 9월 13 ? 0:03 sched root 1 0 0 9월 13 ? 0:20 /sbin/init root 2 0 0 9월 13 ? 0:00 pageout root 3 0 1 9월 13 ? 103:32 fsflush root 201 1 0 9월 13 ? 1:30 /usr/lib/inet/inetd start Unix/Linux
작업 제어: ps (Linux) 프로세스 상태 : ps ps –[aefglu] -a all (단말기에서 제어하는, 세션리더 제외) -e everything (단말기에서 제어하지 않는 것도) -f full listing -l long -u user a all (단말기에서 제어하는, 세션 리더 포함) -A everything (= -a) u display user-oriented format x lift(제거) “must have a tty” (예) <Unix style> $ ps –ef <BSD style> $ ps aux (Linux 출력) UID PID PPID C STIME TTY TIME CMD root 1 0 0 Oct08 ? 00:00:03 /sbin/init root 2 0 0 Oct08 ? 00:00:00 [kthreadd] root 3 2 0 Oct08 ? 00:00:00 [migration/0] root 4 2 0 Oct08 ? 00:00:01 [ksoftirqd/0] ‘-’ UNIX options ‘’ BSD options ‘--’ GNU long options Unix/Linux
작업 제어: ps –el $ ps –el 헤더(header) F: flags(현재는 별 의미 없음) S: state [Unix] O: running, S: sleeping, R: runnable, Z: zombie, T: stopped [Linux] D: uninterruptible sleep R: running or runnable T: stopped W: paging X: dead Z: zombie UID: user ID PID: process ID PPID: parent ID C: central processor utilization STIME: starting time(24시간 지나면 월일로) TTY: terminal 번호 TIME: 실행된 분과 초 CMD: command Unix/Linux
작업 제어: PROCESS STATE CODES Unix O Process is running on a processor. S Sleeping: process is waiting for an event to complete. R Runnable: process is on run queue. Z Zombie state: process terminated and parent not waiting. T Process is stopped, either by a job control signal or because it is being traced. Linux D Uninterruptible sleep (usually IO) R Running or runnable (on run queue) S Interruptible sleep (waiting for an event to complete) T Stopped, either by a job control signal or because it is being traced. W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z Defunct ("zombie") process, terminated but not reaped by its parent. For BSD formats and when the stat keyword is used, additional characters may be displayed: < high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group Unix/Linux
작업 제어 프로세스 잠재우기 [p139 참조] 프로세스에 시스널 보내기 : kill 자식 프로세스를 기다림 : wait sleep seconds (예) $ (sleep 10; echo done) & 프로세스에 시스널 보내기 : kill kill -signalId {pid}+ signalId : 프로세스에 보내지는 시그널의 번호 또는 이름 (default: 15 = TERM) kill -l 적법한 시그널 이름의 목록을 보여준다 (signal #1 ∼ #31) (참고) SIGKILL(-9)과 SIGSTOP(Unix -23,Linux -19)은 signal()로 가로채지 못함 kill 0 현재의 셀과 관련된 모든 프로세스를 종료 시킴 (예) $ kill -KILL 27490 자식 프로세스를 기다림 : wait wait [pid] 명시된 자식 프로세스가 종료될 때까지 해당 셀이 일시 정지 명시된 pid가 없으면 모든 자식 프로세스가 종료되기를 기다림 (예) $ (sleep 30; echo done 1) & 24193 $ (sleep 30; echo done 2) & 24195 $ echo done 3; wait; echo done 4 결과는 ? Unix/Linux
기타 명령어 찾기 : $PATH 동일한 이름의 표준 유틸리티 무시 : $HOME 또는 ./명령 종료와 종료 코드 : exit, $? (Bourne shell), $status (C shell) 공통의 핵심 내장 명령어 eval exec shift umask 내장 명령어 확인 <Linux> $ man builtins <Unix> $ man shell_builtins 로 내장명령어 확인 Unix/Linux
요약 정리 제 3 장 정리: 중요한 세 가지 셸의 기능 사이의 관계 일반적인 셸 메타 문자 입출력 리다이렉션 파일 이름 대치 파이프 명령어 대치 명령열 명령어 그룹 스크립트의 구성 지역 변수와 환경 변수의 차이점 2가지 다른 종류의 인용 기본적 작업 제어 셸이 명령을 찾기 위해 사용하는 체계 여러 가지 핵심 내장 명령어