본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스]셸(Shell)이란? 셸의 변경, 쉘 개념, 기능, 종류와 특징(sh, bash, csh, tcsh, ksh)

리눅스 완전 정복 : 리눅스 목차


셸 스크립트 프로그래밍을 하려면 셸이 무엇인지 먼저 알아야겠죠!


셸(Shell)이란?

리눅스의 셸은 명령어와 프로그램을 실행할 때 사용하는 인터페이스입니다. 



좀 더 자세히 말하면 셸은 커널(Kernel)과 사용자간의 다리역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 해요.


무슨말인지 모르겠다구요~?

셸은 쉽게 말해 우리가 맨날 봤던 Server의 검은 바탕의 글자만 있는 텍스트 모드나 X윈도의 '터미널'처럼 명령어를 입력하는 환경을 말해요.


[Server의 텍스트모드 콘솔 창]

Once we login in, some system information messages are typically displayed, and then we can type commands to the shell program. (Some system start a window management program when you log in, but you generally end up with a shell running in one of the windows) A shell is a command-line interpreter that reads user input and executes commands.

로그인 하면 시스템 정보가 출력되는데 그리고 나서 우리는 셸 프로그램에다가 명령어를 입력할 수 있습니다. (어떤 시스템은 로그인하면 윈도우 관리 프로그램을 시작시키기도 하는데 결국 그 윈도우 중 하나에 셸 프로그램이 돌아갈거예요)

셸은 커맨드라인 인터프리터라고 해서 우리의 명령어를 읽고 실행하는 기능을 합니다.


셸(Shell)은 Windows의 명령 프롬프트와 비슷해보이지만 훨씬 강력한 프로그래밍 기능을 가지고 있습니다. 앞으로 리눅스 셸을 잘 활용하는 데 필요한 셸 스크립트 프로그래밍을 배울거예요.

[Windows의 명령 프롬프트]


셸의 기능 

1. 사용자와 커널 사이에서 명령을 해석해 전달하는 명령어 해석기 기능이 있습니다.

2. 셸은 자체 내에 프로그래밍 기능이 있어서 프로그램을 작성할 수 있어요. 셸 프로그래밍 기능을 이용하면 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램으로 제작 할 수 있습니다. 셸 프로그램을 셸 스크립트라고 불러요

3. 사용자 환경 설정의 기능 - 초기화 파일 기능을 이용해 사용자의 환경을 설정할 수 있습니다. 로그인 할 때 이 초기화 파일이 실행되서 사용자의 초기 환경이 설정돼요. 셸을 공부하는데 가장 중요한 것 중 하나가 환경변수의 이해입니다. 다음 포스팅에서는 셸의 환경변수에 대해서 다뤄볼거예요.



셸의 종류와 특징

셸은 커널에서 분리된 별도의 프로그램이어서 다양한 종류의 셸이 존재하고 현재까지도 지속적으로 개발되고 있습니다.

요약하면 위 사진과 같아요.


Bourne Shell - sh

Bourne Shell(sh)는 유닉스 셸의 오리지날이라고 할 수 있습니다. 최초의 본격적인 셸이예요. 셸 이름은 개발자 벨 연구소의 Steave Bourne(스티브 본) 이름을 땄습니다. 오리지날인만큼 모든 유닉스 시스템에서 사용할 수 있으나 오리지날이라서 미흡한 점이 많습니다. 이 오리지날을 기반으로 더 좋은 셸들이 개발되었으니까요 ㅎㅎ

그 중 가장 큰 단점은 상호대화식 방식을 취하고 있지 않습니다.

.sh라는 파일 확장자를 가진 파일이 특정 종류의 셸 스크립트를 가리키는 것이 보통이지만 대부분의 셸 스크립트는 파일 확장자를 지니지 않습니다.

프롬프트 - 일반 유저는 $ 프롬프트를 사용하고 root 유저는 # 프롬프트를 사용합니다 


bash 배시(배쉬?)

리눅스를 안해본 사람도 bash는 맥 노트북 사용하면서 들어봤을 거예요. 

현재 리눅스의 표준 셸이죠. 우분투와 페도라가 기본적으로 사용하는 셸 역시 bash입니다. 1989년 브라이언 폭스가 GNU프로젝트를 위해 개발한 배시셸은 sh셸을 기반으로 만들어졌어요. GNU기억나죠? 자유로운 소프트웨어를 희망하는 프로젝트죠

bash는 korn Shell과는 다르게 공짜였으므로 급속히 전파되었습니다. 항상 공짜는 파급력이 엄청나죠 ㅎㅎ


bash 셸은 sh를 기반으로 Korn Shell(ksh)과 C Shell(csh)의 좋은 점만 합한 것으로 생각하면 됩니다. bash는 리눅스뿐만 아니라 GNU 운영체제, 맥 OS X 등 다양한 운영체제에서 사용 중입니다.

프롬프트 - 일반 유저는 $ 프롬프트를 사용하고 root 유저는 # 프롬프트를 사용합니다 (전 포스팅에서 매번 명령어치면서 많이 봐서 익숙하죠?)


bash의 특징

- Alias 기능 (명령어 단축 기능)

- History 기능 ( ↑ 또는 ↓ )

- 연산 기능

- Job Control 기능

- 자동 이름 완성 기능 (tab)

- 프롬프트 제어 기능

- 명령 편집 기능


C 셸 - C Shell, csh

C 셸은 1978년 버클리 대학의 빌 조이가 개발한 것으로 C언어를 기반으로 만들어졌습니다. 빌 조이는 vi에디터를 개발하기도 했죠 ㅎㅎ대단한 사람..ㅎㅎ C셸은 강력한 프로그램 작성 기능을 가지고 있어요 그래서 그런지 셸 스크립트 언어가 C와 비슷합니다. 크기가 커지고 처리 속도도 느려졌다는 단점이 있으나 편리한 기능 때문에 일반 사용자들이 즐겨 사용했던 셸입니다.


콘 셸 - Korn Shell, Ksh

콘 셸은 1983년 AT&T사의 벨 연구소에서 근무하던 데이비드 콘이 개발했습니다. 이 콘 셸 역시 오리지널인 sh(본 셸)을 확장해서 만들었으며 벨 연구소 사용자들의 요청으로 C셸의 많은 기능들을 추가했습니다. C셸의 특징들을 모두 제공하면서 처리 속도도 빠르다는 장점이 있어요.


이 외에도 tcsh, Z-shell, dtksh 등 다양한 셸이 있습니다.


셸의 확인

현재 자신이 사용하는 셸이 무엇인지 알아보려면 여러 방법이 있는데

# echo $SHELL 이나 # env | grep SHELL 명령어를 입력해주면 됩니다.

또 passwd 파일을 확인함으로써 알 수도 있습니다. passwd 배웠는데 혹시 구조 기억나나요?


여기 7번이 shell을 보여주는 구간이네요 

# cat /etc/passwd 

명령어를 통해서 사용자가 어떤 shell을 사용하고 있는지 확인할 수 있습니다.


즉 시스템은 로그인했을 때 이 필드를 확인해서 어떤 셸을 실행시켜줄 지 알 수 있어요.



변경 가능한 셸 확인하기 / 셸 변경하기 

사용자의 기본 셸 변경은 시스템 관리자만 가능해요. 일반 사용자는 현재 실행중이 셸을 임시로만 바꿀 수 있습니다. 

일시적으로 변경할 경우 직접 셸 이름을 명령어에다가 쳐서 실행시키면 됩니다.

# /bin/sh

일시적으로 csh 셸로 변경 --> exit 누르면 취소됩니다.

변경 가능한 셸을 확인 후 # cat /etc/shells

sh 셸로 일시적으로 변경해줬습니다 # /bin/sh

일시적 변경이기 때문에 일반 사용자인 ubuntu도 셸을 임시로 변경할 수 있습니다.


chsh (change shell) 명령어

chsh 명령은 사용자의 로그인 shell 속성을 변경합니다. 

chsh 명령어만 치니까 다 변경할 셸을 입력하라고 나오네요.

이렇게 변경하고 나면 변경된 셸 적용은 다음 로그인 할 때부터 적용됩니다. 


예시

# cat /etc/shells 

변경 가능한 셸 확인하기

# chsh -l

변경 가능한 셸 확인하기 (우분투에서는 사용불가합니다) 

이 document를 보면 알겠지만 우분투에서 chsh의 옵션은 -h, -R, -s만 가능해요.


# chsh ubuntu -s /bin/dash

ubuntu 사용자 셸을 dash 셸로 변경하기


# vi /etc/passwd

vi 편집기를 이용해서 기본 사용 셸을 변경할 수도 있습니다 (root 권한 필요)



문제

리눅스마스터 2급 2016년 1회 기출

다음 ( 괄호 ) 안에 들어갈 내용으로 알맞은 것은?

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

( 괄호 )은 버클리대학의 빌 조이가 개발한 것으로 C언어를 기반으로 만들어졌으며, 강력한 프로그램 작성 기능을 가지고 있다.

히스토리 기능, 별명 기능, 작업 제어 등 유용한 기능을 포함하였다.

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

1. bash

2. csh

3. tcsh

4. ksh


다음 중 셸에 대한 설명으로 틀린 것은?

1. 커널에서 분리된 별도의 프로그램이며 다양한 종류의 셸이 존재한다.

2. 사용자가 로그인 셸을 일시적으로 변경하려면 chsh 명령을 사용하면 된다.

3. 리눅스에는 ksh와 csh 계열의 장점을 결합한 bash를 표준으로 하고 있다. 

4. 콘 셸은 AT&T 사의 데이비드 콘이 개발하였다.


리눅스마스터 2급 2016년 2회 기출

다음 중 변경 가능한 셸의 목록을 확인할 때 사용하는 파일로 알맞은 것은?

1. /etc/shells

2. /etc/shell

3. /etc/bashrc

4. /etc/profile


정보보안기사 기출

다음 중 셸(Shell)에 대한 설명으로 틀린 것은?

1. 커널과 사용자간의 다리 역할을 하는 것으로 사용자로부터 명령을 받아 해석하고 프로그램을 실행하는 역할을 한다

2. 셸은 커널에 포함된 프로그램으로 다양한 종류의 셸이 존재하며 현재까지 개발되고 있다

3. 사용자가 시스템에 로그인 했을 때 각 사용자에게 설정된 셸이 부여된다.

4. 리눅스에서 사용 가능한 셸은 bash, ksh, tcsh, zsh 등이 있다.


리눅스 마스터 2016년 3회 기출

다음 설명으로 알맞은 것은?

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

리눅스의 표준 셸이다

GNU 프로젝트에 의해 개발되었다

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

1. bash

2. tcsh

3. zsh

4. ksh

답: 1