본문 바로가기

Learning/└◆Shell Scripts

[ShellScripting] 본 셸(Bourne shell)의 개요

________________________________________________________________________________

 

 

1 부 본쉘

 

1 장 유닉스 쉘

2 장 본쉘의 개요

3 장 본쉘의 동작

4 장 유닉스 명령어

5 장 본셀의 특징

6 장 본셀 프로그래밍

 

________________________________________________________________________________

 

 

 

 

2 장 본쉘의 개요

----------------------------

1. 본쉘의 역할

2. 로그인 쉘

3. 본쉘 프로그램의 사용 범위

4. 쉘 변경 및 확인

----------------------------

 

 

 

여러가지 유닉스에서 제공되고 있는 쉘은 본쉘(Bourne shell, AT&T), C (C Shell, 버클리 쉘), 콘쉘(Korn Shell, AT&T, 본쉘 확장)이다. 이 중 본쉘 스크립트는 표준 유닉스의 쉘로 시스템을 관리하는 곳에서 사용하고 있다. 예를 들어 RC(Run Control) Startup Script 등에서 시스템 관리를 위해 사용되는 대부분이 본쉘 스크립트이다. 본쉘은 작으면서도 간결하고 빠른게 동작한다. 그래서 시스템 관리자의 경우 스크립트를 작성하는데 주로 본쉘을 사용한다. 이는 본 쉘이 C 쉘에 비해 스크립트를 간단하면서도 빠르게 작성할 수 있게 지원하기 때문이다.

 

본쉘의 주요 기능들 중 하나는 명령행 프롬프트에서 입력된 명령어들을 해석하는 대화형 기능이다. 쉘은 명령행에서 입력된 명령어들을 분석하여 '토큰'이라는 단어 단위로 해석한다. 토큰은 탭이나 빈칸, 개행문자 등 공백으로 구분된다. 입력된 명령어들에 메타문자들이 포함되어 있으면 적절하게 처리한다. 쉘은 파일 입출력과 백그라운드 작업을 처리하며, 명령행에서 입력이 정상적으로 분석되었을 경우 해당 명령어를 찾아 실행한다.

 

본쉘이 제공하는 또 다른 주요 기능은 작업환경을 사용자가 정의할 수 있다는 점이다. 대부분의 경우, 이 기능을 쉘 초기화 파일에서 이루어진다. 이 파일들에서는 터미널 키, 윈도우 속성, 검색경로와 관련된 변수, 터미널 타입, 기본 텍스트 편집기, 프로그래밍을 위한 라이브러리 등에 대한 설정이 들어 있다.

 

본쉘은 해석형 프로그래밍 언어로도 쓸수 있다. 스크립트라고 불리는 쉘 프로그램은 파일 안에 나열된 명령어들로 구성된다. 본쉘 프로그램은 편집기에서 작성된다. 본쉘 프로그램은 유닉스 명령어와 변수 대입, 조건문, 반복문 등 기본적인 프로그래밍 구조를 적절히 배치시킨 것이다. 본쉘 스크립트는 컴파일 과정을 거칠 필요가 없다. 본쉘은 스크립트의 각 행을 사용자가 키보드로 입력한 명령어인 것처럼 해석해 낸다.

 

 

 

 

 

1

본쉘의 역할

 

 

 

쉘은 명령어 해석기로서, 쉘 프롬프트(Shell Prompt)에서 들어오는 모든 명령어가 적절히 실행되도록 하는 것이 쉘의 궁극적인 역할이다.

 

쉘의 역할을 정리하여 보면 다음과 같다.

입력을 읽고 해당 명령행을 분석한다.

특수 문자들을 평가한다.

파이프, 리다이렉션, 백그라운드 프로세스를 설정한다.

시그널을 처리한다.

프로그램을 올바르게 실행시킨다.

 

 

 

 

 

2

로그인 쉘

 

 

 

최초로 구동되는 프로세스는 PID 1init 프로세스이다. init 프로세스는 inittab이라는 설정 파일의 내용을 읽거나(System V의 경우), getty 프로세스를 생성한다(BSD의 경우). 이 프로세스들은 터미널 포트를 열어, 표준 입력(Standard Input)과 표준 출력(Standard Output), 표준 에러(Standard Error)의 방향을 설정한 후, 화면에 로그인 프롬프트를 띄운다. /bin/login 프로그램이 실행되면 패스워드를 요구하게 된다. 입력된 패스워드를 암호화해서 확인한 후에 초기 환경을 설정하고, 패스워드 파일의 맨 마지막에 기록되어 있는 사용자 쉘(/bin/sh)을 실행한다. 본쉘은 시스템 파일인 /etc/profile을 찾아서, 그안에 들어 있는 명령어들을 실행한다. 그런 다음, 사용자의 홈 디렉토리에서 초기화 파일인 .profile의 내용을 읽어 들인다. .profile에 설정된 내용들이 수행되고 나면, 기본 프롬프트인 달러 기호($)가 화면에 나타난다. 본셀이 사용자의 명령을 기다리는 것이다.

 

 

 

 

 

3

본쉘 프로그램의 사용 범위

 

 

 

쉘 프롬프트에서 명령어를 직접 입력 할 수 있거나 쉘이 파일로부터 명령어를 읽어 들일수 있다. 파일안에서 포함된 쉘 명령어를 쉘 스크립트(Shell Script) 또는 쉘 프로그램(Shell Programming) 이라고 한다. 보통 쉘스크립트라고 부른다. 이것은 긴 프로그램은 아니고, 간단한 몇줄 또는 몇십줄의 프로그램 라인을 가지고 있는 단일 목적으로 개발되는 프로그램이기 때문이다.

 

 

 

(1) 쉘 프로그램을 사용하는 경우

 

쉘 프로그램을 사용하는 경우는 시스템에 있는 많은 파일들이나 반복적인 작업을 일괄적으로 처리하기 위해 사용되는 경우가 대부분이다.

 

시스템에 존재하는 많은 파일을 가지고 작업을 할 경우

반복적으로 같은 작업을 할 경우

일정에 따라 자동으로 작업을 수행하고자 할 경우

 

 

 

(2) 쉘 프로그램을 사용하지 않는 경우

 

쉘 프로그램은 바이너리(Binary) 형태의 실행 파일 형식으로 만들어 지는 것이 아니기 때문에 속도면에서 느리다. 그래서 대량의 작업이나 혹은 매우 복잡한 프로그램이 필요한 경우는 사용하지 않는다. 만약 복잡한 작업이나 세세하고 많은 라인이 필요한 프로그램인 경우에는 쉘 프로그램을 사용하지 않고, C 프로그램(고급언어)을 사용할 것을 권장한다.

 

다음은 쉘 프로그램을 사용하지 않는 경우에 대한 예이다.

빠른 작업 속도를 원하는 경우

해야 하는 작업이 매우 복잡한 경우

다른 하드웨어 환경이나 소프웨어를 요구하는 경우

 

 

 

 

 

4

쉘 변경 및 확인

 

 

 

 

(1) 로그인 쉘과 현재 쉘 확인

 

현재 사용중인 쉘에 관해 확인 할 수 있는 방법은 여러 가지가 있다. 로그인시에 적용되는 쉘에 관한 정보를 확인 하기 위해서는 /etc/passwd 파일의 마지막 필드를 참조하면 된다. 또한 SHELL 변수의 내용으로도 확인 할 수가 있다.

 

현재 사용중인 쉘 확인 : ps 명령어 사용

로그인 쉘 확인 : /etc/passwd 파일의 마지막 필드, $SHELL 변수 확인

 

다음 예제는 grep 명령어를 통해 user01 사용자의 로그인 쉘을 확인한 것이다.

 

$ grep user01 /etc/passwd

user01:x:1000:10:End User:/export/home/user01:/bin/ksh

 

일반 사용자의 SHELL 변수는 login 프로그램에 의해 설정이 된다. /etc/default 디렉토리 안에 존재하는 login 파일에 ALTSHELLYES로 설정되어 있기 때문에 가능하다. 만약 ALTSHELL 변수가 NO로 설정되어 있다면 사용자의 SHELL 변수는 login 프로그램에 의해서 선언되지 않고 기존에 존재하는 값으로 유지된다. 이 경우 일반사용자는 자신의 환경파일에 SHELL 변수를 선언하여 변경할수는 있다.

 

다음 예제는 echo 명령어를 통해 사용자가 SHELL 변수의 내용을 확인한 것이다.

 

$ echo $SHELL

/bin/sh

 

다음과 같이 현재 명령어가 실행되고 있는 쉘을 확인 할때는 ps 명령어를 사용한다. ps 명령어는 현재의 가상 터미널 상에서 실행 되어진 모든 프로세스에 관한 목록을 보여준다.

$ ps

PID TTY TIME CMD

10360 pts/5 0:00 ksh

 

$ ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

8 S 0 10360 10358 0 50 20 ? 252 ? pts/5 0:00 ksh

 

 

[참고] ps 명령어 간략한 사용법

ps 명령어는 관리자에게 있어 프로세스를 확인 할 때 가장 많이 사용하는 명령어이다. 다음의 사용방법 들에 관해 잘 익혀 두자.

명령어 형식

설 명

ps

ps -l

ps -a

ps -t pts/3

ps -U 103

ps -ef | grep inetd

현재 쉘에서 실행 중인 프로세스를 간략하게 확인

현재 쉘에서 실행 중인 프로세스를 자세하게 확인

사용자가 실행한 모든 프로세스를 확인

특정한 가상 터미널에서 실행중인 프로세스 확인

특정한 사용자가 실행한 모든 프로세스 확인(103UID이다.)

시스템의 모든 프로세스 중 특정한 프로세스 확인

 

(2) 임시로 쉘 변경

 

현재 명령어가 실행되고 있는 쉘을 변경하고자 할때는 원하는 쉘을 실행 시키면 된다. 이런 경우 exit 명령어를 사용하여 현재 쉘을 종료하고 원래 쉘로 돌아 갈 수 있다. 이 경우 관리자나 일반 사용자 모두 사용이 가능하다.

 

$ /bin/sh /* 현재 sh 실행 */

or

$ /bin/csh /* 현재 csh 실행 */

 

 

 

(3) 영구적으로 쉘 변경

 

아래 예제는 기본 쉘인 /bin/bash/bin/ksh로 변경하는 과정이다. /etc/passwd 파일의 마지막 필드인 로그인쉘 필드를 변경하는 것이다. 일반 사용자는 자신의 쉘을 바꿀수 없고 root 사용자만 어떤 사용자의 쉘이든 변경이 가능하다. 일반 사용자는 passwd 명령어에 -e 옵션을 사용할수는 없다. 일반사용자가 passwd 명령어의 -e 옵션을 사용하는 경우 “Permission denied" 메시지를 받게 된다. root 사용자는 passwd 명령어에 -e 옵션을 사용하여 시스템에 존재하는 모든 사용자 로그인 쉘을 쉽게 변경이 가능하고 /etc/passwd 파일의 로그인쉘 필드를 직접 편집하여 작업하여도 상관이 없다.

 

(일반사용자)

$ passwd -e

Permission denied

-> 일반사용자는 로그인 쉘을 변경 할 수 없다.

-> 로그인 쉘이 변경된다는 것은 /etc/passwd 파일의 마지막 필드를 변경하는 것이기 때문에, 일반사

용자는 /etc/passwd 파일을 변경할 수 있는 권한(퍼미션)이 없으므로 자신의 로그인쉘을 변경할

수는 없다.

 

(root사용자)

# passwd -e shuser (# usermod -s /bin/bash shuser)

Old shell: /bin/sh

New shell: /bin/ksh [새로운 쉘 입력]

passwd: password information changed for shuser

-> 관리자가 사용자의 로그인 쉘을 변경 할 수 있다.

-> 관리자는 자신의 로그인 쉘 뿐만 아니라 모든 사용자의 로그인쉘을 변경할 수 있다.

 

 

 

(4) 시스템에서 사용할 수 있는 쉘 확인

 

/etc/shells 파일에 등록 되어진 쉘은 ftp 같은 응용 프로그램에서 사용할 때 사용된다. 일반사용자는 로그인시에 이곳에 등록된 쉘만 사용할 수 있다. 기본적으로는 이 파일이 존재하지 않으며, 이 파일이 없다면 쉘에 관한 제한이 없는 것이다. 만약 /bin/usr/bin 디렉토리가 심볼릭 링크 되어져 있어서 같은 파일들이 존재한다고 하더라도 /etc/shells 파일에 정의가 /bin, /usr/bin 모두 선언이 되어 있지 않으면, 선언이 되지 않은 쉘은 사용할 수 없다. 자세한 정보는 shells(4) 매뉴얼 페이지를 확인한다. (# man -s 4 shells)

 

$ cat /etc/shells

/bin/sh

/bin/ksh

/bin/csh

/bin/bash

/usr/bin/sh

/usr/bin/ksh

/usr/bin/csh

/bin/false

/bin/true

-> /etc/shells 파일에서 선언된 /bin/false, /bin/true 등은 Anonymous FTP 사용자, Guest 사용자,

특정 프로그램 사용자등과 같이 로그인을 못하는 사용자를 위해 선언된 것이다.

-> /etc/shells 파일은 솔라리스 시스템에 기본적으로 존재하는 파일은 아니다. 관리자가 만들어 주

고 내용을 선언해서 사용해야 한다.