셸 (소프트웨어)
셸(shell)은 운영체제 상에서 다양한 운영체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램이다. 흔히 쉘이라고도 쓰는데, 한글맞춤법에 따르면 '셸'이라고 쓰는 게 맞다. 셸은 운영체제 내부의 핵심 부분인 커널과 응용 소프트웨어을 연결해주는 역할을 한다.
목차
개요
셸은 사용자와 운영체제의 내부인 커널 사이에서 사용자의 명령을 해설하고 처리 결과를 알려주는 시스템 프로그램이다. 셸의 사전적 의미인 '껍데기'에서 따온 말로 내부의 커널이 존재하고 사용자가 이를 감싸고 있는 껍데기인 인터페이스를 통해 커널에 접근한다는 개념이다. 셸의 종류는 명령 줄 인터페이스(CLI)와 그래픽 사용자 인터페이스(GUI)로 구분된다. 그 외에도 이 환경으로 접속하는 보안 접속 프로그램(SSH)을 뜻한다.[1]
역사
그래픽 사용자 인터페이스의 아이디어는 1960년대에 제안되었다. 이반 서덜랜드가 1963년에 개발한 스케치패드는 최초로 완전한 그래픽 사용자 인터페이스를 구현한 것이었으며, 비슷한 시기에 더글라스 엥겔바트를 비롯한 SRI인터내셔널의 연구자들은 하이퍼링크를 기반으로 마우스를 사용자는 온라인 시스템(NLS)을 개발했다. 'ls'의 하이퍼링크 개념은 제록스 파크에서 그래픽으로 확장되었으며, 1973년에 개발된 제록스 알토 컴퓨터는 그래픽 사용자 인터페이스를 사용하는 최초의 컴퓨터가 되었다. 현재 대부분의 그래픽 사용자 인터페이스들은 기본적으로 이 인터페이스로부터 유래했으며, 어떤 사람들은 이들을 '파크 사용자 인터페이스(PUI)'라 부르기도 한다. 파크 사용자 인터페이스는 윈도, 메뉴, 아이콘, 라디오 단추, 체크 상자 등의 그래픽 요소들을 사용하며, 마우스와 같은 포인팅 장치를 키보드와 함께 사용한다.[2]
특징
셸은 사용자와 커널 사이에서 명령을 해석해 전달하는 명령어 해석기 기능이 있고, 자체 내에 프로그래밍 기능을 이용하여 프로그램 작성이 가능하며, 셸 프로그래밍 기능을 이용하여 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램을 제작할 수 있다. 또한, 사용자 환경 설정 기능을 통해 초기화 파일 기능을 이용하여 사용자의 환경을 설정할 수 있다. 셸은 사용자와 리눅스 커널 사이에서 중간자 역하을 수행한다. 각 셸이 제공하는 기본적인 기능은 비슷하지만, 편리 기능이나 사용자 환경 설정 등에서 다소 차이가 있다. 셸이 제공하는 기능은 크게 명령어 해석기 기능, 프로그래밍 기능, 사용자 환경 설정 기능 구분된다.[3]
명령어 해석기
셸이 제공하는 가장 기본적인 기능은 사용자와 커널사이에서 명령을 해석하여 전달하는 해석기와 번역기 기능이다. 셸은 사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고 적절한 프로그램을 실행한다. 사용자가 로그인을 하면 셸은이 자동으로 실행되어 사용자가 명령을 입력하기를 기다린다. 실행되는 셸을 로그인 셸이라고 부르며, '/etc/passwd' 파일에 사용자별로 지정되어 있다. 셸이 사용자의 명령을 기다리고 있음을 나타내는 표시를 프롬프트라고 한다. 셸은 대기 상태로 있다가 사용자가 입력한 명령 및 스크립트를 읽어들여 이 명령이 셸 자체의 내장 명령인지 아닌지를 판단한다. 내장 명령은 특별한 추가 작업 없이 바로 실행된다. 내장 명령이 아닌 경우에는 별도의 실행 파일이 있음을 뜻하며, 셸은 자식 프로세스를 만들고 이 자식 프로세스가 실행 파일을 실행하게 한다. 자식 프로세스가 실행 파일을 실행하는 동안 부모인 셸은 대기 상태가 되며, 자식 프로세스가 실행을 종료하면 셸의 대기 상태가 해제되어 복귀하면서 다시 프롬프트를 출력한다.[3]
프로그래밍
셸은 자체 내에 프로그래밍 기능이 있어서 프로그램도 만들 수 있다. 셸의 프로그래밍 기능을 이용하여 여러 명령을 사용하고 반복적으로 수행하는 작업을 하나의 프로그램으로 사용할 수 있다. 이렇게 작성된 셸 프로그램을 셸 스크립트라고 한다. 셸 스크립트(shell script)는 셸이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영체제를 위해 쓰인 스크립트이다. 단순한 도메인 고유 언어로 여기기도 하며, 셸 스크립트가 수행하는 일반 기능으로는 파일 이용과 프로그램 실행 및 문자열 출력 등이 있다. 셸 스크립트는 유닉스 셸을 위해 쓰인 스크립트이며, 도스(COMMAND.COM)와 윈도우(cmd.exe) 명령 줄 스크립트는 보통 배치 파일로 두 개의 속성 모두를 지칭한다. .sh라는 파일 확장자를 가진 파일이 특정 종류의 셸 스크립트를 가리키는 것이 보통이지만, 대부분의 셸 스크립트는 파일 확장자를 지니지 않는다.[4] 셸 스크립트는 만들기 쉽고 유지하기 편리하며, 셸 스크립트를 만드는 데 필요한 모든 것은 사용자에게 친숙한 문서편집기뿐이다. 컴파일러, 링커, 로더등이 불필요하여 오브젝트(object) 파일을 유지할 필요가 없다. 스크립트가 바뀐 경우에는 다시 실행하여 시간을 절약할 수 있어 결과를 빨리 확인할 수 있다. 일반적으로 셸 스크립는 간단하면서도 고급언어와 유사한 프로그램 구조를 가지며, 문서(text)형태로 저장되어 저장 공간을 최소화 한다. 또한, 일반적으로 사용하는 유닉스(UNIX) 명령처럼 시스템 명령으로 사용할 수 있다.[5]
사용자 환경 설정
셸은 사용자 환경을 설정할 수있도록 초기화 파일 기능을 제공한다. 초기화 파일에는 명령을 찾아오는 경로를 설정 및 파일과 디렉터리를 새로 생성할 때 기본 권한을 설정한다. 또한, 다양한 환경 변수 등을 설정할 수도 있다. 파일과 디렉터리를 새로 생성할 경우에는 기본 권한을 설정 및 다양한 환경 변수 등을 설정할 수 있다. 사용자가 로그인하여 초기화 파일이 실행되고, 사용자별로 특성에 맞게 초기 환경이 설정된다.[3]
종류
본 셸
본 셸(Bourne Shell, sh)은 유닉스 버전 7의 기본 유닉스 셸이었다. 톰프슨 셸을 대체하는 실행 파일 이름이 sh로 같고, AT&T 벨 연구소의 스티븐 본이 개발했으며, 1977년 처음으로 유닉스 버전 7에 포함되었다. 본 셸 자체의 기능은 비교적 강력하지 않지만, 유닉스 시스템의 기본 프로그램을 조합하여 사용하면 매우 강력한 기능을 하는 스크립트를 만들 수 있다. 본 셸은 PWB 셸을 대체할 목적으로 설계되었다. 셸 스크립트를 필터로 사용할 수 있고, 제어 흐름과 변수를 포함한 프로그래밍 가능성을 제공한다. 모든 입출력 파일 서술자의 제어, 스크립트 내의 신호 관리 제어, 셸 스크립트 내의 신호 관리 제어가 가능하다. 셸 스크립트를 해석할 때 문자열 길이의 제한이 없으며, 메커니즘을 인용하는 문자열의 합리화 및 일반화했고, 환경 메커니즘의 특징을 가지고있다.[6]
- 대시 셸(Dash Shell) : 본 셸을 기반으로 개발된 셸로, 포직스(Posix) 표준을 준수하면서 보다 작은 크기로 개발되었다. 암키스트 셸(ash)의 NetBSD 버전으로, 1997년 초에 허버트 슈(Hervert Xu)가 리눅스에 이식했고, 2002년에 대시로 이름을 변경했다. 우분투는 6.1 버전부터 본 셸 대신 대시 셸을 기반으로 사용하고 있다. 기존의 셸에 비해 부팅 시에는 셸 스크립트를 빠르게 실행시키고, 파일크기가 작으며, 신뢰성이 높기 때문이다.[3]
C 셸
C 셸(C Shell, csh)은 기본적으로 캘리포니아 대학교 버클리 캠퍼스에서 C 언어를 전신으로 하여 빌 조이(Bill Joy)가 개발한 유닉스용의 셸로, 본 셸보다 한층 강력한 프로그램 작성 기능을 가지고 있어 C 셸이라 불리게 되었다. 대표적인 기능으로 히스토리(History), 앨리어스(Alias), 작업 제어(Job Control) 기능이 있다. 히스토리는 많은 개발자에게 유용한 기능으로 과거에 사용한 명령어를 반복하거나 수정하기 매우 편리하다. 별명의 경우에는 자주 쓰는 긴 명령어를 짧게 사용할 수 있도록 도와주었으며, 작업 제어 기능은 프로세서에 우선순위를 두는 것으로 효율적인 작업이 가능하다. 하지만, 초기에는 버그가 많아 사용하기에 무리가 있었고, 일반 사용자의 기본 프롬프트는 호스트네임(hostname) 뒤에 % 표시가 붙었다. 대화형 사용법에서는 본 셸과 대부분 호환되지만, 전혀 다른 프로그래밍 인터페이스를 가지고 있고, 히스토리 대체라는 복잡한 기능으로 대신하고 있다. 또한, 명령행 편집 기능은 제공하지 않는다.[7]
- TC 셸(TC Shell, tcsh) : 코넬 대학교(Cornell University)에서 C 셸 수정본에 콘 셸의 기능을 포함하여 개발된 셸이다. 95%의 C 셸과 5%의 새로운 기능이 추가되어 만들어졌다.
콘 셸
콘 셸(Korn shell, ksh)은 1980년대 초에 벨 연구소의 데이비드 콘이 개발한 유닉스 셸로, 1983년 7월 14일 USENIX에서 발표되었다. 기타 초기 기여자들은 벨 연구소 개발자들인 마이크 비치(Mike Veach)와 팻 설리번(Pat Sullivan)이었는데 이들은 각자 이맥스(Emacs)와 Vi 에디터 스타일 라인 편집 모드 코드를 작성했다. 콘 셸은 본 셸의 기능에 C 셸의 유용한 몇 가지의 유용한 기능을 추가한 것으로 본 셸로 작성된 스크립트와 프로그램은 콘 셸에서 바로 사용할 수 있다. 일반 사용자의 기본 프롬프트는 $ 모양이다.[7]
배시
프리소프트웨어재단(FSF)이 개발한 배시(BASH)는 C 셸이나 콘 셸에 추가된 유용한 특성을 본 셸에 추가하여 개선한 셸로, 최초로 개발된 셸인 본 셸의 변종이라 할 수 있다. 배시는 유닉스에서 사용하는 커맨드 셸의 일종으로 GNU 프로젝트를 위해 만들어졌다. 일반적으로 bash로 줄여 부른다. 초기의 유닉스 셸인 본 셸과 새로 태어났다는 뜻의 영어 'born again'을 합쳐 1987년에 브라이언 폭스에 의해 만들어졌다. 1990년 이후에는 쳇 레이미가 주로 관리하고 있다. 배시 명령어의 문법은 대부분이 sh와 호환되어 쓰일 수 있다. 또한 ksh, csh 에서 많은 아이디어를 받아서 명령 히스토리, 디렉터리 스택, $RANDOM POSIX 형식 명령어 편집기능 등을 지원한다. 또한, 입력 중에 명령어나 파일 이름을 자동 완성해 주는 기능도 지원한다. 배시는 다양한 리눅스 시스템, 맥 오에스 텐의 기본 셸이며, 수많은 유닉스 계열 운영체제에서 동작한다. 마이크로소프트 윈도에서도 시그윈 프로젝트 등에 의해 이식되어 있다. 배시는 지엔유(GNU)와 지피엘(GPL)로 배포되고 있으며, 지엔유 프로젝트 FTP 사이트를 비롯하여 수많은 인터넷 사이트에서 내려받을 수 있다.[7]
Z 셸
콘 셸과 매우 유사한 셸이지만 콘 셸보다 더욱 많고 유용한 기능 등을 추가하여 개선한 것이다.
비교
셸의 기능 비교 구분 본 셸 C 셸 콘 셸 배시 TC 셸 Z 셸 작업 제어 X O O O O O 별칭 X O O O O O 명령어 히스토리 X O O O O O 명령줄 편집 X X O O O O 로그인 및 로그아웃 와칭 X X X X O O 파일명 완성 X O O O O O 맞춤법 수정 X X X X O O 프로세스 치환 X X X O X O 셸 스크립트 O O O O O O 무료 이용가능 X X X O O O
각주
참고자료
- 〈셸〉, 《나무위키》
- 〈셸〉, 《위키백과》
- 〈UNIX Shell과 Shell 프로그램〉, 《커피닉스》
- jh0110love , 〈SHELL(셸,셀) 이란?〉, 《네이버 블로그》, 2009-11-09
- 〈본 셸〉, 《위키백과》
- 〈셸 스크립트〉, 《위키백과》
- 이종원, 〈우분투 리눅스 시스템 & 네트워크〉, 《한빛아카데미》
같이 보기