제6장 쉘 창병모 2012.09
6.1 쉘 소개
쉘(Shell)이란 무엇인가? 쉘의 역할 쉘은 사용자와 운영체제 사이에 창구 역할을 하는 소프트웨어 명령어 처리기(command processor) 사용자로부터 명령어를 입력받아 이를 처리한다
쉘의 종류 유닉스/리눅스에서 사용 가능한 쉘의 종류 쉘의 종류 쉘 실행 파일 본 쉘 /bin/sh 콘 쉘 /bin/ksh C 쉘 /bin/csh Bash /bin/bash tcsh /bin/tcsh
쉘의 종류 본 쉘(Bourne shell) 콘 쉘(Korn shell) Bash(Bourne again shell) 벨연구소의 스티븐 본(Stephen Bourne)에 의해 개발됨 유닉스에서 기본 쉘로 사용됨 콘 쉘(Korn shell) 1980년대에는 역시 벨연구소에서 본 쉘을 확장해서 만듬. Bash(Bourne again shell) GNU에서 본 쉘을 확장하여 개발한 쉘 리눅스 및 맥 OS X에서 기본 쉘로 사용되면서 널리 보급됨 Bash 명령어의 구문은 본 쉘 명령어 구문을 확장함 C 쉘(C shell) 버클리대학의 빌 조이(Bill Joy) 쉘의 핵심 기능 위에 C 언어의 특징을 많이 포함함 BSD 계열의 유닉스에서 많이 사용됨 최근에 이를 개선한 tcsh이 개발됨어 되어 사용됨
로그인 쉘(login shell) 로그인 하면 자동으로 실행되는 쉘 보통 시스템관리자가 계정을 만들 때 로그인 쉘 지정 /etc/passwd ... chang:x:109:101:Byeong-Mo Chang:/user/faculty/chang:/bin/csh 로그인 쉘 변경(리눅스) $ chsh Changing login shell for chang Old shell : /bin/sh New shell : /bin/csh $ logout login : chang passwd: %
6.2 쉘의 기본 기능
쉘의 기본 기능 명령어 처리 시작 파일 스크립트 사용자가 입력한 명령을 해석하고 적절한 프로그램을 실행 로그인할 때 실행되어 사용자별로 맞춤형 사용 환경 설정 스크립트 쉘 자체 내의 프로그래밍 기능
쉘의 실행 절차
시작 파일(start-up file) 쉘마다 시작될 때 자동으로 실 행되는 고유의 시작 파일 export 명령어 주로 사용자 환경을 설정하는 역할을 하며 환경설정을 위해서 환경변수에 적절한 값을 설정한다. $ 환경변수명=문자열 $ TERM=xterm $ echo $TERM xterm export 명령어 $ export TERM 환경 변수 확인 $ env HOSTNAME=CS2 HOST=CS2 TERM=xterm SHELL=/bin/sh GROUP=faculty USER=chang ...
시작 파일(start-up file) 본 쉘 bash C 쉘 /etc/profile ~/.profile /etc/bashrc ~/.bash_profile ~/.bashrc C 쉘 /etc/.login ~/.login ~/.cshrc
시작 파일 예 .profile 시작 파일 바로 적용 PATH=$PATH:/usr/local/bin:/etc TERM=vt100 export PATH TERM stty erase ^ 시작 파일 바로 적용 $ . .profile
6.3 쉘 명령어 처리
쉘 명령어 종류 내장 명령어 유틸리티 프로그램 쉘 내에 내장되어 있는 명령어 $ echo -n 명령줄인수* $ cd 디렉터리 명령어를 위한 실행 파일이 별도로 존재하는 명령어 $ ls /bin/ls 환경변수 PATH PATH = .:/bin:/usr/bin:/usr/local/bin:/etc
입출력 재지정 및 파이프 출력 재지정 출력 추가 입력 재지정 문서 내 입력 파이프 $ 명령어 > 파일 $ 명령어 >> 파일 입력 재지정 $ 명령어 < 파일 문서 내 입력 $ 명령어 << 단어 ... 단어 파이프 $ 명령어1 | 명령어2
복합 명령어 명령어 열(command sequence) 명령어 그룹(command group) $ 명령어1; … ; 명령어n $ date; who; pwd 명령어 그룹(command group) $ (명령어1; … ; 명령어n) $ date; who; pwd > out1.txt $ (date; who; pwd) > out2.txt
조건 명령어 열(conditional command sequence) $ 명령어1 && 명령어2 $ gcc myprog.c && a.out $ 명령어1 || 명령어2 $ gcc myprog.c || echo 컴파일 실패
파일 이름 대치 대표문자를 이용한 파일 이름 대치 대표문자 대표문자를 이용하여 한 번에 여러 파일들을 나타냄 명령어 실행 전에 대표문자가 나타내는 파일 이름들로 먼저 대 치하고 실행 $ gcc *.c $ gcc a.c b.c c.c 대표문자 * 빈 스트링을 포함하여 임의의 스트링를 나타냄 ? 임의의 한 문자를 나타냄 [..] 대괄호 사이의 문자 중 하나를 나타내며 부분범위 사용 가능 $ ls *.txt $ ls [ac]*
명령어 대치(command substitution) 명령어를 실행할 때 다른 명령어의 실행 결과를 이용 역따옴표(`)로 에워싼 다른 명령어 부분은 그 명령어의 실행 결 과로 대치된 후에 실행 $ echo 현재 시간은 `date` $ echo 현재 디렉터리 내의 파일의 개수 : `ls | wc -w` 현재 디렉터리 내의 파일의 개수 : 32
따옴표 사용 따옴표를 이용하여 대치 기능을 제한 $ 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' $ name=나가수 $ echo '내 이름은 $name 현재 시간은 `date`' 내 이름은 $name 현재 시간은 `date` $ echo "내 이름은 $name 현재 시간은 `date`" 내 이름은 나가수 현재 시간은 2011년 12월 8일 목요일 오후 03시 43분 12초
따옴표 사용 정리 1. 작은따옴표(')는 파일이름 대치, 변수 대치, 명령어 대치를 모 두 제한한다. 2. 큰따옴표(")는 파일이름 대치만 제한한다. 3. 따옴표가 중첩되면 밖에 따옴표가 효력을 갖는다.
6.4 쉘 스크립트
쉘 스크립트 쉘 스크립트는? 쉘 스크립트 종류 명령어 및 유틸리티들을 적절히 사용하여 작성한 프로그램 1. 첫 번째 줄에 사용할 쉘을 #!경로명 형태로 지정 #!/bin/csh #!/bin/ksh #!/bin/bash #!/bin/sh 2. 단지 첫 번째 줄이 #으로 시작되면 C 쉘 스크립트로 간주 3. 그 외는 본 쉘 스크립트로 간주한다.
쉘 스크립트 작성 및 실행 에디터를 사용하여 스크립트 파일을 작성한다. chmod를 이용하여 실행 모드로 변경한다. test.sh #!/bin/sh echo 현재 시간: date echo 현재 사용자: who echo 시스템 현재 상황: uptime chmod를 이용하여 실행 모드로 변경한다. $ chmod +x test.sh 스크립트 이름을 타입핑하여 실행한다. $ test.sh
6.5 작업 제어
프로세스 상태: ps ps [-옵션] 명령어 $ ps -aux (BSD 유닉스) $ ps -ef (시스템 V) 현재 존재하는 프로세스들의 실행 상태를 요약해서 출력 $ 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: 프로세스에 대한 좀 더 자세한 정보를 출력
sleep sleep 명령어 지정된 시간만큼 실행을 중지한다. $ sleep 초 $ (echo 시작; sleep 5; echo 끝)
kill kill 명령어 현재 실행중인 프로세스를 강제로 종료 $ kill [-시그널] 프로세스번호 $ (echo 시작; sleep 5; echo 끝) & 1230 $ kill 1230
wait 명령어 $ wait [프로세스번호] 해당 프로세스 번호를 갖는 자 식 프로세스가 종료될 때까지 기다린다. 프로세스 번호를 지정하지 않 으면 모든 자식 프로세스를 기 다린다. $ (sleep 10; echo 1번 끝) & 1231 $ echo 2번 끝; wait 1231; echo 3번 끝 2번 끝 1번 끝 3번 끝 $ (sleep 10; echo 1번 끝) & $ (sleep 10; echo 2번 끝) & $ echo 3번 끝; wait; echo 4번 끝 3번 끝 1번 끝 2번 끝 4번 끝
기타 명령어 exit nohup nice id batch 쉘을 종료하고 종료값(exit code)을 부모 프로세스에 전달 로그아웃 이후에도 프로세스를 계속 실행하고자 하는 경우 $ nohup 명령어 [인수] & 명령어의 결과는 시스템 내의 nohup.out 파일에 기록 nice 프로세스의 우선순위를 조정하는 명령어 id 사용자 자신의 사용자 ID와 그룹 ID를 출력하는 명령어 batch 여러 개의 명령어를 순차적으로 수행시키는 명령어
6.6 내장 명령어
shift shit 명령어 shift.sh $ shift.sh a b c d 명령줄 인수를 하나씩 왼쪽으로 이동한다. #!/bin/sh echo 첫 번째 인수 $1, 모든 인수 $* shift $ shift.sh a b c d 첫 번째 인수 a, 모든 인수 a b c d 첫 번째 인수 b, 모든 인수 b c d
eval, exec eval exec eval은 명령어의 출력을 쉘 명령어로 실행시킨다.. $ eval `echo x=5` $ exec date
핵심 개념 쉘은 사용자와 운영체제 사이에 창구 역할을 하는 소프트웨어로 사용자로부터 명령어를 입력받아 이를 처리하는 명령어 처리기 역 할을 한다. 입력 재지정은 명령어의 표준입력을 키보드 대신에 파일에서 받게 한다. 출력 재지정은 명령어의 표준출력을 모니터 대신에 파일에 하게 한다. 유닉스 명령어 및 유틸리티들을 적절히 사용하여 프로그램을 작성 할 수 있는데 이러한 프로그램을 쉘 스크립트라고 한다. 쉘에서 사용할 수 있는 명령어는 쉘 내에 내장되어 있는 내장 명 령어와 명령어를 위한 실행 파일이 별도로 존재하는 유틸리티 프 로그램이다.