1.1.1 Shell의 정의
UNIX의 Shell은 다음과 같이 정의할 수 있다.
* Shell은 운영체제와 사용자 사이의 중계 역할을 하는 명령어 해석기(command interpreter)이다.
* Shell은 변수를 정의할 수 있고 조건문, 반복문, 산술 연산 등을 할 수 있는 완전한 프로그램 언어(program language)이다.
(1) Command Interpreter
사용자와 시스템간의 대화를 가능하게 해 주는 것으로 사용자가 입력시킨 명령어 라인을 읽고서 필요한 시스템 기능을 실행시킨다.
(2) Program Language
파일에 저장된 일련의 명령 군을 실행할 수 있으며, 제어 구조를 이용해 명령의 실행 순서를 바꿀 수 있다.
1.1.2 Shell 프로그램
Shell이 실행할 수 있는 명령들을 모아 놓은 파일을 말하며, C-language로 만든 파일을 c-program이라 하듯 shell language로 만든 파일을 shell program 혹은 shell script라 부른다.
기존의 프로그램 언어(C, PASCAL 등)가 coding을 통해 새로운 프로그램을 만드나, shell script는 UNIX시스템에 있는 명령어들과 기본적으로 shell이 가지고 있는기능을 조합하여 프로그램을 만든다. 즉, 이미 "있는" 프로그램들을 제어 구조와 혼합하여 새로운 기능을 하는 프로그램을 만든다.
Shell script은 shell이 실행할 수 있는 UNIX 명령과 제어 구조의 조합으로 구성된 파일이다.
1.1.3 Shell 프로그램의 장점
Shell 프로그램을 사용하는 것은 타 프로그램 언어에 비해 다음과 같은 장점이 있기 때문이다.
1.2.1 Shell의 역사
UNIX 시스템은 크게 3 부분으로 나룰 수 있다. 가장 중심은 시스템을 구성하는 hardware영역, 다음은 HW와 응용 프로그램을 중계하는 OS 영역(운영체제), 그리고 응용프로그램으로 나눌 수 있다. 그리고 이 운영체제 부분중 HW와 밀접한 관계가 있는 부분을 커널(kernel)이라고 부르는데, 커널은 시스템을 구성하는 HW에 따라 변한다. 응용 프로그램들은 운영체제의 일부인 kernel을 통해 시스템 HW와 연결 되므로 시스템을 구성하는 HW와 별개로 운영된다.
이와같이 응용 프로그램들은 HW와 별개로 운영되므로, UNIX의 다른 HW에 이식하고자 할때, 커널 부분만 이식하면 된다.
Shell도 운영체제(커널)의 일부가 아니고 "ls", "vi" 등과 같은 응용 프로그램 중 하나이다. 즉 UNIX는 처음부터 shell을 운영체제의 주요 부분과 분리된 독립 프로그램으로 설계하였다. 따라서 오늘날 사용되고 있는 shell에는 여러 가지가 있으며, 사용자가 이를 선택할 수 있다.
새로 개발되는 shell의 특징은 주로 속도를 향상시키는 것으로, 더 적은 키 입력으로 같은 결과를 얻을 수 있게 하는 것이다.
1.2.2 Shell의 종류
UNIX 시스템에는 기본적으로 Bourne Shell, C Shell, K Shell이 설치되어 있으며, 기타 다른 Shell들은 Internet을 통해 얻을 수 있다.
(1) Bourne Shell
이 shell은 구조적 프로그램을 만들 수 있는 프로그램 언어를 내장했고, 특히 입/출력 제어에 강력한 기능을 제공했다. 그러나 이 shell의 프로그램 환경 (비대화식 사용자 환경 : non-interactive user interface)은 매우 훌륭한 반면 대화식 사용자 환경(interactive user interface)은 매우 빈약하여 좀 더 나은 "무엇인가"가 나타날 여지를 남겨 놓았다.
(2) C shell
Bourne shell의 단점인 대화식 사용자 환경을 강화하고 몇 가지 새로운 개념(job control, history, alias등)을 도입한 C-shell을 캘리포니아 대학교 버클리 분교에서 만들었다. 그러나 초기의 C-shell은 많은 결함(bug)이 발견되어 이것을 사용하여 완전한 shell script를 만드는 데는 문제가 있었다. 그래서 많은 사람들이 C-shell의 사용에 주저했으나, 편리한 사용자 환경으로 인해 대화식 사용자 환경은 C-shell을 사용하고 비 대화식 환경(shell program)에는 주로 Bourne shell을 사용하는 기현상이 나타났다.
C Shell의 프로그램의 경우 언어 구조가 C 언어와 유사하기 때문에 이해하기가 쉽다. 여기서도 C Shell을 위주로 설명을 한다.
(3) TC shell
C Shell의 결함을 고치고 몇 개의 새로운 기능(command line editing, spelling correction, login/logout watching 등)을 추가하여 TC shell(tcsh)이 만들어 졌다. 그러나 대다수의 UNIX시스템 제조업체에서 TC shell을 선택하지 않고 표준 C shell을 기본적으로 탑재했기 때문에 지금까지 비표준 shell로 남아 있다.
(4) Korn Shell
AT&T의 David Korn에게 이러한 혼돈을 정리할 수 있는 idea가 있었고, 그 결과로 Korn shell(ksh)을 만들었다. 즉 Bourne shell의 비 대화식 사용자 환경에 C shell의 훌륭한 대화식 사용자 환경을 덧붙인 것이다. Korn shell은 곧 system V의 일부가 되었지만 나머지 다른 shell들과는 달리 "공짜"가 아니어서 ksh을 사용하려면 AT&T에 사용료를 지불해야 하는 문제가 있었다.
(5) Bourne Again Shell
이 시기에 GNU project에서 Korn shell에 버금가는 기능을 갖는 "공짜" shell이 필요하다는 결정을 하였고, 그 결과 bash(Bourne Again Shell)가 탄생했다. Bash는 Korn shell과 마찬가지로 Bourne shell 에 기초하여 c-shell의 여러기능을 추가했고, Korn shell과는 달리 "공짜"였으므로 급속히 전파되어 현재 새로운 세대의 shell중에서 가장 인기 있는 shell이 되었다.
(6) Z-shell
더 완전한 shell을 향한 끝없는 추구는 지금도 계속되고 있고, 그 결과 Bourne shell에 기초한 또 다른 shell인 Z-shell(zsh)이 나타났다. 이 shell에는 전문가도 정확히 사용하기 힘든 여러 가지의 다양한 기능이 많이 추가되었다.
1.2.3 shell의 비교
Shell의 기능 비교
Function |
sh |
csh |
ksh |
bash |
tcsh |
zsh |
Job control |
X |
O |
O |
O |
O |
O |
Aliases |
X |
O |
O |
O |
O |
O |
Command history |
X |
O |
O |
O |
O |
O |
Command line editing |
X |
X |
O |
O |
O |
O |
login/logout watching |
X |
X |
X |
X |
O |
O |
File name completion |
X |
O |
O |
O |
O |
O |
Spelling correction |
X |
X |
X |
X |
O |
O |
Process substitution |
X |
X |
X |
O |
X |
O |
Shell scripts |
O |
O |
O |
O |
O |
O |
Freely available |
X |
X |
X |
O |
O |
O |
1. editor를 이용해 nfile이라는 파일을 열어 다음의 내용을 입력한다.
#!/bin/csh
if ($#argv == 0) then
awk ‘{printf "%4d %s\n", NR, $0}’
exit 0
endif
foreach file ($argv[*])
if (-f $file) then
awk '{printf "%4d %s\n",NR, $0}' $file
else
echo $0\: No file $file
endif
end
2. 파일을 실행 가능 하도록 파일 속성을 변경한다.
% chmod 755 nfile
3. Script을 실행시킨다.
% nfile nfile
% nfile [enter] (아무 내용이나 입력을 하고 [enter]를 누른다)
[CTRL+D]
4. 프로그램의 동작