[2. 리눅스 운영 및 관리] 02 셸(Shell) (1) 개념 및 종류
System/Linux Master

[2. 리눅스 운영 및 관리] 02 셸(Shell) (1) 개념 및 종류




개념

  시스템을 공부하는 사람이라면 누구나 셸(Shell)이라는 단어는 한 번쯤 들어본 적이 있을 것이다. 셸은 쉽게 말하면 사용자가 입력한 명령어를 해석하여 커널에 전달하는 역할을 수행하는 명령어 해석기(Command Interpreter)라고 정의할 수 있다. DOS의 Command.com과 동일한 기능을 수행하는 프로그램이다. 커널에 해석한 명령어를 전달할 때 셸은 커널과 사용자 간의 대화식 인터페이스를 제공하여 접근을 더 쉽게 도울 수 있다. 또한 셸 자체가 프로그래밍 기능을 가지고 있기 때문에 강력한 스크립트 언어이기도 하다. 더 부가적인 기능으로는 입출력 방향 재지정(redirection)[각주:1]과 파이프(pipe)[각주:2] 기능 제공과 포그라운드 / 백그라운드 프로세스 실행이 가능한 것이 있다.


종류

  셸은 그 기본 원리만 알면 쉽게 개발할 수 있는 프로그램 중 하나이기 때문에, 셸의 종류는 무궁무진하게 많다. 지금 이 순간에도 새로운 자작 셸이 탄생하고 있을 지도 모른다. 이 포스팅에서는 리눅스에서 주로 많이 접할 수 있는 셸들에 대해서만 다루어 보도록 하겠다.

  셸은 크게 본셸(Bourne Shell) 계열과 C셀 계열로 나뉜다. 둘은 첫 눈에 보기에도, 즉 사용자 프롬프트에서부터 차이점이 명확하게 보이기 때문에 헷갈릴 가능성은 걱정하지 않아도 된다. 사용자 프롬프트가 '$'이면 본셸 계열, '%'임ㄴ C셸 계열을 사용하고 있다는 것이다. 대부분의 셸들은 본셸 계열의 기능을 포함하여 확대, 발전한 형태이다. C셸은 본셸의 모든 기능과 명령어 히스토리(history), 별명(alias), 작업 제어 기능을 추가로 가지고 있다.

  우선 본셸 쪽부터 살펴보자. 아래 표는 본셸 계열의 셸들의 주요 특징을 요약하여 정리한 것이다.

종류

실행 파일

특징

본셸

/bin/sh

 · 벨 연구소의 스티븐 본이 1979년 개발한 UNIX의 기본 셸

콘셸

(korn shell)

/bin/ksh

 · AT&T사의 데이비드 콘이 1986년 개발

 · 벨 연구소에서 본셸을 확장해서 만듦

 · 명령어 완성 기능, 히스토리 기능 지원

배시 셸

(bash shell)

/bin/bash

 · 브레인 폭스가 1989년 개발

 · 본셸을 기반으로 GNU 프로젝트에 의해

 개발

 · Linux 표준 셸로 채택

 · Linux, MAC OS X 등 다양한 OS에서 사용됨

 · 명령어 완성 기능, 히스토리, 명령어 치환, 편집 등을 지원

 · POSIX와 호환 가능

지셸

(z shell)

/bin/zsh

 · Paul Falstad가 1990년 개발

 · 확장형 본셸, 콘셸의 재작성 셸

 · 강력한 history 기능

 · 향상된 명령행 편집 기능

 · 파일명 중간에서부터도 자동 완성 기능

 · Tab, 방향키를 이용해 선택 기능 포함


  다음은 C셸 계열이다.


종류

실행 파일

특징

C셸

/bin/csh

 · 버클리 대학의 빌 조이가 1981년 개발

 · C언어의 특징을 많이 포함함

 · 히스토리, 별명, 작업 제어 등의 기능 포함

 · 다양한 프로그래밍 작성 기능

tcsh셸

/bin/tcsh

 · Ken Greer가 1982년 개발

 · 확장 C셸로, BSD 계열에서 가장 많이 사용

 · 명령어 편집 기능 제공

 · emacs 사용

 · history explorer

 · 자동 완성 기능

 · 자동 로그아웃

 · 로그인 상태, 사용자, 터미널 모니터링

 · $host, $hosttype 새로운 환경 변수



셸 확인 및 변경


1. 로그인 셸 확인


  셸의 기본적인 개념에 대해서는 어느 정도 다져놓았으니 이제 사용하는 방법을 익힐 차례이다. 리눅스 셸과 관련된 여러 가지 파일과 명령어들을 알아보자. 우선 셸을 사용할 때에는 사용자가 로그인 후 자동으로 생성되는 로그인 셸(login shell)과 사용자가 직접 변경하고 실행하는 서브 셸(sub shell)로 구분할 수 있다. 리눅스 운영체제에서 로그인 셸을 확인하고 싶을 때에는 /etc/shells에서 확인할 수 있다.


  리눅스의 기본 개념을 다루고 설치하는 과정을 설명한 포스트에서 설치한 CentOS7에서 'cat /etc/shells' 명령어를 실행한 결과이다. 이 예시에서는 본 셸(/bin/sh, /usr/bin/sh)과 배시 셸(/bin/bash, /usr/bin/bash)을 사용할 수 있다는 것을 알 수 있다. 여담으로 설정에 따라 각 사용자마다 다른 셸을 사용하게 만들 수도 있다.


  /etc/passwd 파일도 셸을 사용할 때 유용하다. 여기서는 각 계정마다 할당된 셸을 확인할 수 있다.




  명령어 echo $SHELL 을 사용하면 현재 로그인한 사용자가 사용하고 있는 셸을 확인할 수 있다.



  예시를 보면 현재 로그인한 사용자 kinew는 bash 셸을 사용하고 있다는 것을 알 수 있다.


2. 셸 변경


  로그인 셸 변경은 반영구적이다. 따라서 관리자가 셸을 변경한 후 다시 한 변 변경하겠다고 결정하기 전까지는 계속 그 셸을 사용한다. 일반 사용자 환경에서 셸을 변경할 때에는 명령어 chsh 를 사용한다.



  명령어 예시를 보며 chsh 명령어의 사용 예를 살펴보자. grep kinew /etc/passwd 는 /etc/passwd 파일에서 'kinew'라는 문자열이 포함되어 있는 줄만 출력한다. 여기서 알 수 있는 정보는 사용자 'kinew'는 로그인 셸이 /bin/bash, 즉 bash 셸로 설정되어 있다는 것이다. 명령어 chsh kinew -s /bin/sh 를 입력하여 사용자 kinew의 로그인 셸을 /bin/sh, 본셸로 바꾼다. 이 때 사용자 본인임을 인증하기 위해 해당 계정의 비밀번호가 요구된다. 비밀번호를 바르게 입력하면 로그인 셸이 성공적으로 변경되었음을 확인할 수 있다. chsh 명령어에 대한 사용 형식은 아래 표를 참고하자.



형식

 chsh [옵션] [계정명] [셸]


옵션

설명

-s

 지정하는 셸을 앞으로 사용할 로그인 셸로 변경

-l

 /etc/shells 파일 안에 지정된 셸을 나열


  chsh -l 옵션은 /etc/shells 파일 내용과 동일한 내용을 보여준다. 덧붙여 셸을 변경한 후에 재부팅을 해야 명령어가 인식되므로 이 점을 주의해야 한다.



  chsh와는 다르게 명령어 usermod는 관리자 환경에서 지정된 계정의 정보를 변경할 때 하용된다.


형식

 usermod [옵션] [계정명]


  usermod 명령어에서 크게 중요한 옵션은 없지만, -s 옵션은 기존의 셸에서 새로운 셸로 변경 시 사용된다.

  1. 입출력 대상으로 표준 입력, 표준 출력, 표준 오류를 사용하지 않고 다른 경로인 파일로 재지정하는 것 [본문으로]
  2. 여러 개의 명령어를 동시에 사용할 수 있게 한다. [본문으로]