5.1 셸의기능과종류 5. 셸 (shell) 셸 (shell) 사용자와 OS 사이의인터페이스프로그램 셸의기본기능 명령어해독기 (command interpreter) 역할수행 셸의종료 ^D( 입력끝 ), exit 명령어, 또는 logout ( 로그인셸만해당 ) 셸의추가기능 셸프로그램처리기능 shell script 표준입출력방향전환, 파이프등의다양한기능 shell의종류 sh (Bourne shell) bash (GNU Bourne again shell) csh (C shell) tcsh (enhanced C shell) ksh (Korn shell) zsh ash (Almquist shell) dash (Debian ash) 2 셸의특징 기본로그인셸변경및서브셸 각 shell 의특징 sh 은 original shell 로서 Bell Lab 의 Steve Bourne 이개발함 사용자편의기능에부족하여후에많은개선된셸들이등장 csh 는 C 언어스타일의 script 언어제공, 작업제어, 히스토리, 별명등의사용자편의기능추가 ksh 은 David Korn 이 sh 을확장하여만든 shell, csh 의추가기능제공 bash 은 sh 을대체하기위해 GNU 프로젝트로개발됨. ksh, csh 의추가기능제공, 현재가장널리사용됨 (Linux 의기본셸 ) ash, dash 는용량이작은 shell 로서빠르게실행됨 ksh, bash sh 공통 tcsh csh 공통 chsh 기본셸변경 $ chsh 새로운셸의경로명을입력 $ chsh s /bin/bash 셸의경로명을인수로지정 새로로그인하여기본셸변경확인 $ chsh l 사용가능한셸확인 /sbin/nologin 을기본셸로지정하면로그인이거절됨 subshell 실행 잠깐동안다른셸을사용하고자할경우에는해당 shell 을명령어로입력하여서브셸을실행 $ csh % csh 생성, csh 프롬프트출력, % exit csh 종료 3 4
5.2 실행파일과내장명령어 출력명령어 내장명령어 (built-in command) shell이자체적으로처리하여실행할수있는명령어 (ex) cd, exit, logout, pwd 등 $ man cd BASH_BUILTINS 매뉴얼출력 $ man bash bash 내장명령어설명 실행파일 (executable file) 외부명령어 실행허가권이있는파일. 실행파일이름을명령어로사용함 유틸리티프로그램, 외부명령어라고도함 일부내장명령어는같은이름의유틸리티프로그램이존재함 (ex) pwd, echo 등 ( 내장명령어가먼저사용됨 ) 셸의명령어처리 명령어가내장명령어이면직접처리하여실행 아니면명령어이름의실행파일을찾아서실행 찾지못하거나실행허가권이없으면에러메시지출력 명령어실행후프롬프트출력 다음명령어입력기다림 echo ( 내장명령어 ) $ echo hello linux 인수를출력 $ echo n hello linux 인수를줄바꿈없이출력 $ echo n hello linux 마지막에빈칸출력 유틸리티프로그램도존재 (/bin/echo) printf C 언어의 printf 함수와유사 $ printf hello linux\n $ printf "%d + %d = %d\n" 10 20 30... 첫째인수 = 출력형식 5 6 실행파일경로 5.3 셸의메타문자 외부명령어실행 명령어가절대경로이름또는상대경로이름이면해당위치의파일실행 아니면, 실행파일경로 (path) 에설정된디렉토리를순서대로검색하여명령어이름의실행파일을찾아서실행 실행파일경로 명령어에대한실행파일을검색할디렉토리들의집합 환경변수 PATH 값으로나타냄 $ echo $PATH 현재의경로출력 메타문자 (meta character) 셸에서특수한용도로사용되는문자 >, <, >> 표준입출력방향전환 (redirection) *,?, [ ] 파일이름대치, 대표문자 (wildcard) pipe & background 처리 $ 변수대치 ( 변수접근 )... ( 교과서 80 쪽참조 ) 메타문자의특수용도제거 메타문자앞에 \ (backslash) 를함께사용 ( 예 : \> ) $ echo hello > world... 출력을파일 world에저장 (redirection) $ echo hello \> world... > 도출력 7 8
5.4 표준입출력방향전환 표준입력방향전환 표준입출력의기본설정 표준입력 (stdin): keyboard 표준출력 (stdout): 화면 표준에러출력 (stderr): 화면 표준출력방향전환 (output redirection) : >, >> 표준출력으로화면대신에 file 을사용 (file 출력 ) 표준에러출력은변화없음 1) crate a file (file 이있으면 overwrite) $ data > stamp.. 출력을파일에저장 2) append to a file (file 이없으면 create, write 허가권이없으면 error) $ data >> stamp.. 출력을파일에추가 (append) 표준출력제거하기 특수파일 /dev/null 로 redirection $ command > /dev/null 표준입력방향전환 (input redirection) : < 표준입력으로키보드대신 file 을사용 (file 입력 ) 입력 file 이없거나 read 허가가없으면 error $ command < infile 표준입력방향전환 Here Document 입력 표준입력으로명령어행에포함되는 inline text 를사용 이기능을 here document 라고도부름 $ command << word >... inline text... >... inline text... > word 임의의단어 inline text 의시작과끝을표시 마지막 word 까지입력해야명령어입력이종료되어실행됨 9 10 5.5 파이프 파이프와 tee 유틸리티 파이프 (pipe): 두 process들을연결하여한 process의표준출력을다른 process의표준입력으로사용함 $ command1 command2 표준입력 command1 pipe command2 표준출력 파이프라인 파이프로연결한 process의시퀀스 $ ls wc w ; 현재디렉토리의파일 / 디렉토리개수 $ ls l /bin more ; 긴출력을화면단위로출력 tee 명령어 -pipe중간에사용하여 pipe 중간출력저장 tee [-ia] file ; 표준입력을표준출력과 file에복사 -i interrupt를무시 -a append to the file 표준입력 $ls tee out2 wc -w (cf) $ ls wc w tee file 표준출력 T ; ls 출력이 out2 에저장되고 wc 의입력으로사용됨 $ date tee out1 ; 명령어출력을화면으로보면서파일에저장함 11 Shell 12
bc 계산기 5.6 파일이름대치 wildcard bc (basic calculator) 계산기 무한정밀도를갖는계산기 대화형으로수식을입력, 계산결과출력 기본적으로정수계산, scale 을지정하면소수점이하자릿수지정 $ bc 10+20 ( 입력 ) 30 scale=3 ( 입력 ) 1/3 ( 입력 ).333 ^D pipe를사용한수식입력 - 비대화형 $ echo 100 + 200-50 bc 파일이름대치 (filename substitution) 대표문자 (wildcard) 를사용하여파일이름패턴을지정할수있으며 인수들은파일이름패턴과매칭되는파일이름의정렬된목록으로대치 되어명령어에인수로전달됨 대표문자 (wildcard) * 임의의길이의문자열 (ex) a* b*.c? 임의의한문자 (ex) a???? [ ] 대괄호내의문자들중한문자 (ex) [A-Z] : 대문자 ( - 는문자범위 ) [aeiou] : 모음소문자 $ echo??? file? a* $ ls l /bin/[x-z]* 매칭되는파일이없으면대치되지않고그대로인수로사용 $ echo z* ; z 로시작하는파일이없으면 z* 를출력 13 14 중괄호파일이름대치 ( 프로그램예 ) wildcard 동작확인 중괄호확장 (csh부터제공 ) abc{def, pqr}xyz abcdefxyz abcpqrxyz 으로대치 $ echo /usr/include/{stdio,signal}.h 중괄호안에 wildcard 사용가능 $ ls -l /usr/include/{std*,signal}.h ( 예 ) 모든인수들을출력하는프로그램 $ vi arg.c #include <stdio.h> int main(int argc, char *argv[]) { int i; for (i=0; i<argc; i++) printf("%d : %s\n", i, argv[i]); return 0; } $ cc arg.c ; a.out 생성 $./a.out a* b? ; 작성한프로그램실행 0 : arg.c ; 프로그램에전달된인수는파일이름대치된것임 1 : a.out 15 16
5.7 백그라운드처리 foreground 작업 셸은명령어수행종료후에 prompt 를출력하고, 다음명령어를입력 보통의명령어수행방법 한터미널에서한번에한개의작업수행 background 작업 셸은명령어수행종료와관계없이즉시 prompt를출력하고다음명령어를입력 한터미널에서여러작업을동시수행가능 실행시간이긴명령어실행시에주로사용 shell shell foreground command background command background 실행 - & $ sleep 100 & [1] 13050 ; 1 은작업번호, 13050 은프로세스번호 $ _ 백그라운드작업과 redirection background 작업종료보고 종료후 shell 에서 Enter 가입력될때에 ( 명령어없이도가능 ) 출력 background 작업의표준입력 터미널입력 ( 키보드 ) 를제어하지않아서키보드입력을사용할수없음 키보드입력이필요하면일시중지 (stop) 되거나에러발생 $ bc & [1]+ Stopped bc 반드시표준입력을미리준비된입력파일로 redirection해야함 $ bc l < bc_pi & "bc_pi" scale=10000.. 소수점이하개수 4 * a(1).. 원주율계산 간단한입력은 pipe로전달가능 $ echo "scale=1000; 4*a(1)" bc l & 17 18 백그라운드작업과 redirection (2) background 작업의표준출력 표준출력은화면 (tty) 에출력 foreground 작업의출력과섞일수있음 표준출력 redirection 을사용하는것이바람직 $ bc -l < bc_pi > out_pi & $ echo "scale=10000; 4*a(1)" bc -l > out_pi2 & 5.8 명령어시퀀스와명령어그룹 명령어시퀀스 ; 여러개의명령어를순서대로실행 $ ls; pwd; date redirection은각명령어별로개별적으로적용 $ ls > ls.txt ; pwd ; date > date.txt background 작업의시퀀스는 ; 없이 & 만사용 $ sleep 100 & sleep 60 & $ sleep 100 & pwd $ pwd ; sleep 100 & 19 20
명령어그룹 중괄호명령어그룹 명령어그룹 괄호안에있는명령어시퀀스로구성 서브셸을생성한후서브셸에서명령어실행 중괄호명령어그룹 입출력방향전환공유 ( ) 명령어그룹과같음 현재셸에서실행 ( ) 명령어그룹과다름 $ (cd /bin; pwd) ; 서브셸에서디렉토리이동 /bin $ pwd ; 현재디렉토리그대로 $ { cd /bin; pwd; } ; 디렉토리이동을포함 /bin $ pwd ; 이동된디렉토리그대로 명령어그룹의명령어들은표준입출력, 표준에러출력을공유 $ (ls -C; pwd ; date) > out.txt 복잡한명령어그룹사용 $ (cmd1; cmd2) & cmd3 $ cmd1 & cmd2 & cmd3 $ (cmd1; cmd2) & (cmd3; cmd4) & 21 22 5.9 종료코드와조건부명령어시퀀스 그룹의종료코드와조건부명령어시퀀스명령어 종료코드 (exit 값 ) 프로세스는종료코드를갖고종료 성공 : exit 값 = 0 실패 : exit 값 = non-zero ( 내장명령어는 1) ( 교과서 p93 의표참조 ) C 언어프로그램에서 main() 함수의종료 : exit 값 = main 함수의 return 값 exit() 함수를사용한종료 exit 값 = exit() 함수의인수 셸의 exit 명령어 $ exit 1 ; exit 값 =1 을반환하고셸을종료 $ exit ; 이전명령어의 exit값을반환하고셸을종료 종료코드보기 -$? echo $? ; 이전명령어의 exit값을출력 $ date; echo $? ; 정상실행 $ data k; echo $? ; 잘못된옵션 명령어그룹의종료코드 마지막에실행한명령어의 exit 값 exit 명령어를사용하여명시적지정가능 $ (echo hi; echo linux); echo $? $ (echo hi; echo linux; exit 10); echo $? 조건부명령어시퀀스 성공조건부시퀀스 : && $ true && echo success $ cc prog.c && a.out 실패조건부시퀀스 : $ false echo failure $ cc prog.c echo compilation error true/false 명령어 항상성공 / 실패인명령어 23 24
5.10 작업제어 Jobs 작업제어 UNIX/Linux 는 multitasing 기능제공 여러작업에대한제어동작이필요 작업의포그라운드 백그라운드간에전환 작업일시중지 작업종료 ps 프로세스상태보기 (process status) $ ps ; 현재터미널에서수행한프로세스정보 $ ps f ; 상세정보 $ ps ef ; 전체프로세스정보 (-e) $ ps u gdhong ; 특정사용자프로세스정보 $ ps axu ; BSD UNIX 옵션 ( 모든프로세스, 상세정보 ) 상세정보내역 p96, p97 표참조 jobs ( 백그라운드 / 일시정지 ) 작업목록보기 (csh 이후 ) $ jobs [1] Running sleep 1000 & [2]- Running sleep 200 & - : 마지막에서두번째참조 [3]+ Running bc -l < bc_pi & + : 마지막참조 작업지정 작업제어명령어에서작업을지정하는데사용 %2 ; 작업번호 2인작업 %prefix ; prefix로시작한작업 %+, %% ; 마지막참조작업 %- ; 마지막에서두번째참조작업 25 26 프로세스종료 작업상태전환 Ctrl-C : 포그라운드작업종료 kill : 백그라운드작업종료 kill 은프로세스에게 signal 을보내는동작수행 주로프로세스를종료시킬때사용 default signal = TERM(15번 ) : 종료 (terminate) $ kill 23202 $ kill %2 TERM signal에의해종료되지않는프로세서는 KILL(9번 ) signal 사용 $ sleep 1000 & $ kill -9 pid 또는 kill KILL pid signal 목록출력 $ kill l 일시중지 ^Z ( 포그라운드작업 ), kill STOP ( 백그라운드작업 ) (csh 에서는 stop 명령어제공 ) suspend ( 셸 ) 잠시부모셸을사용하고자할때사용 fg 포그라운드전환 fg [%job] ; 인수가없으면마지막참조작업 bg 백그라운드전환 bg [%job] 27 28
5.11 변수와변수대치 환경변수 변수 문자열을저장 변수이름 숫자, 문자, _ 로구성, 숫자로시작하지않음 변수의종류 환경변수 서브셸 / 자식프로그램에게변수값이복사되어전달됨 지역변수 현재셸에서만사용 변수값할당및접근 할당 : $ var=value (csh 은 set var = value) 접근 : $ echo $var $ echo ${var}ing "$ 변수 " 는변수값으로대치됨 변수대치 (variable substitution) 환경변수지정 $ export var ; 기존변수를환경변수로지정 $ export var=value ; 변수값을할당하면서환경변수로지정 (csh 에서는 setenv var value) 모든환경변수출력 $ export (csh 에서는 setenv) 모든변수출력 $ set (csh 에서는 set 은지역변수출력 ) 29 30 5.12 미리정의된변수 PATH 실행파일경로 PATH 실행파일경로디렉토리지정 (: 로구분 ) $ echo $PATH 디렉토리들은콜론 (:) 으로구분, 앞의 ( 왼쪽 ) 디렉토리부터검색 PATH 변경 / 추가 $ PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ; 절대지정 $ PATH=${PATH}:~/bin ; 뒤에추가 $ PATH=~/bin:$PATH ; 앞에추가 ( 우선권 ) 유틸리티 overload 같은이름의명령어파일이두개이상존재하면 PATH 의앞 ( 왼쪽 ) 에위치한디렉토리의명령어가수행됨 추가되는경로가표준경로보다뒤에위치하는것이바람직함 그렇지않으면기존유틸리티가 overload 되어사용못할수있음 31 32