[Linux] 셸(Shell) 이란?

반응형

1. 셸 (Shell) 이란?

리눅스에 명령어를 실행해보자. echo 명령어는 인자로 입력한 문자열을 출력한다. 인자를 HELLO 로 지정하면 다음과 같이 출력된다.

이렇게 명령어를 실행하면 리눅스 내부적으로 다음과 같이 동작한다.

(1) 입력한 echo HELLO 문자열을 인식한다.

(2) echo 명령어를 찾는다.

(3) 명령어를 실행한다.

(4) 실행결과를 화면에 표시한다.

이 과정에서 (3) 명령어를 실행하는 과정은 리눅스의 본체인 커널이 수행한다. 커널은 운영체제 중심에서 CPU나 메모리 등의 하드웨어를 관리하면서 명령어를 실행하고 프로세스를 관리한다. 리눅스에서는 사용자가 커널을 직접 조작하는 것이 아니라 사이에서 명령어를 조작해주는 소프트웨어가 필요하다. 이 소프트웨어가 셸이다. 즉, 셸(Shell) 이란 커널의 인터페이스에 해당한다.

셸(shell)의 사전적 의미는 조개 껍질이다. 커널을 감싸고 있기때문에 셸이라 붙여진 것이다.

 

2. 셸과 커널이 분리되어 있는 이유

셸과 커널이 분리되어 있는 이유는 다음과 같다.

  • 커널을 바꾸지 않고 셸만 바꿀 수 있다.
  • 리눅스 이외의 OS를 사용할 때도 셸만 이식하면 똑같이 사용할 수 있다.
  • 셸을 사용할 때 에러가 발생하는 등의 문제가 있을 때 리눅스 커널에 미치는 영향을 최소한으로 줄일 수 있다.

 

3. 셸의 종류

3.1. 로그인 셸

리눅스에 로그인하면 셸이 입력을 대기한다. 사용자가 로그인할때 리눅스가 자동으로 셸을 시작하기 때문이다. 이렇게 로그인 후 처음으로 시작되는 셸을 로그인 셸이라 부른다.

 

로그인 셸을 확인하는 방법

$ echo $SHELL

/bin 디렉토리에 있는 bash 가 로그인 셸이다. 리눅스에서는 별도로 지정하지 않으면 bash 가 로그인 셸로 시작한다.

우분투 환경에서 로그인셸 확인 : /bin 디렉토리의 bash 가 로그인 셸이다.

3.2. sh

AT&T 벨 연구소의 스티븐 본이 만들어서 본 셸, B셸 이라고도 불린다. 리눅스뿐만 아니라 Solaris, FreeBSD 등 여러 운영체제에서 사용할 수 있다.

표준 셸의 지위를 갖고있어 셸 스크립트를 작성할 때는 sh를 사용하는 것이 일반적이다. 하지만 오래되었기 때문에 기능이 적고 대화형에서 사용하기에는 불편하다. 따라서 로그인셸로 사용되는 경우는 거의 없다.

 

3.3. csh

C셸이라 불린다. sh보다 대화형 조작에 편리한 기능을 갖추고 있지만 셸문법이 sh와 크게 다르게 따문에 셸 스크립트 작성에는 적합하지 않다. 현재는 tsch가 나와 많이 이용하진 않는 편이다.

 

3.4. bash

sh를 바탕으로 기능이 추가된 셸이다. sh와 호환성이 있으므로 sh를 대체할 수 잇다. 또 대화형 조작에 필요한 기능을 갖추고있어 많은 리눅스에서 기본 로그인셸로 많이 이용하고 있다. 셸 스크립트를 작성하는 데도 적합하다.

 

3.5. tcsh

csh에 이어 개발된 C셸 계열의 셸이다. 대화형 조작에 편리한 기능을 많이 갖추고 있지만 셸스크립트에 적합하지 않다. 현재 FreeBSD의 로그인 셸로 사용되고 있지만 사용자는 줄고 있다. 맥도 버전10.2(Jaguar) 까지는 tcsh를 사용했었다.

참고로, tcsh 등 C셸 계열에서는 사용자 프롬프트가 $가 아닌 %이다. 

 

3.6. zsh

비교적 최근에 개발된 셸이다. bash 와 tcsh 의 기능에 독자적인 기능이 추가되었다. 기능이 매우 다양하다.

 

M2 맥북에서는 zsh가 로그인쉘 인것을 확인할 수 있었다.

(명령어를 입력하지 않아도 터미널 상단에 표시되며, C셸 계열이므로 사용자 프롬프트가 %으로 되어 있다.)

 

4. 프롬프트 (prompt)

명령어를 입력할때 다음과 같이 표시된다. 이를 셸의 프롬프트(prompt) 라고 한다. 프롬프트는 사전적으로 사용자에게 어떤 결정을 내리도록 한다는 뜻이다. 즉, 셸이 사용자로부터의 명령어를 받아들이는 것을 의미한다.

유저명과 호스트명을 동일하게 gymin으로 구축했다.

우분투에서는 기본적으로 다음과같이 표시된다.

user@hostname:~$

보통 문서등에서 이를 짧게 표시할때는 $ 만을 표시한다. 또, 일반 사용자가아닌 루트 사용자 # 으로 표시한다.

  • 일반 사용자 프롬프트
$ <명령어>
  • 슈퍼 사용자(root) 프롬프트
# <명령어>

 

4.1. 대화형 조작

명령어를 직접 입력하고 그 결과를 확인하는 조작 방식을 대화형(인터렉티브) 방식이라 한다.

 

4.2. 셸 스크립트

실행하고 싶은 명령어들을 미리 파일에 입력해두고 그 파일을 셸에 전달하여 명령을 실행하는 방식도 가능한데, 이렇게 일련의 명령어 흐름을 기술한 파일을 셸 스크립트라 한다.

 

 

5. 일시적으로 셸 바꾸기

셸도 일종의 명령어 이므로 아용하고 싶은 셸을 입력하고 실행만하면 된다. 리눅스에 기본으로 포함되어있는 sh 셸로 변경해보자.

 

(1) 현재 사용중인 셸에서 sh 로 변경해보기

sh 이 실행되어 프롬프트가 $ 로 표시된다. 

(2) bash 로 돌아가보자

(3) 다시 원래 셸로 돌아간 것처럼 보이지만, bash → sh → bash 순서로 기동한 상태이다. 셸 위에 셸이 중첩 실행되어있다.

셸 위에 기동한 셸은 로그인 셸이 아닌 비로그인 셸(일반 셸)이다. 그래서 logout 명령어로 로그아웃을 시도하면 에러가 발생한다.

비로그인 셸에서 logout 명령어로 종료할 수 없다.

not login shell 이라고 출력되는 에러메세지로 확인할 수 있듯이 비로그인 셸이다.

따라서 비로그인 셸에서 나오려면 exit 명령어를 이용해야 한다.

 

(4) exit 명령어로 비로그인 셸에서 나오기

exit 를 2번 실행하여 bash &rarr; sh &rarr; bash 순으로 비로그인셸에서 빠져나왔다.

이렇게 exit 명령어로 비로그인 셸에서 로그인 셸로 돌아올 수 있다.  

 

6. 터미널 (terminal)

터미널이란 컴퓨터의 입출력만을 담당하는 전용 하드웨어이다. 입력장치(키보드)와 출력장치(모니터)로 구성된다. 이를 소프트웨어로 구현한 터미널 에뮬레이터로 리눅스를 다루는데 사용된다. 터미널이라 하면 이러한 터미널 에뮬레이터를 말하는 경우가 많다. 운영체제별로 다양하게 존재하며 대표적으로 다음과 같이 존재한다.

운영체제 터미널 에뮬레이터
Windows PuTTY, Tera Term
MacOS X terminal, iTerm2
Linux GNOME Terminal, Konsole

터미널 과 셸은 다른 소프트웨어이다. 터미널은 리눅스머신에서 돌아가는 셸의 입출력 화면을 제공하는 소프트웨어이다.

반응형