셸

[섬네일|upright=1.35|1980년대 후반과 유사한 그래픽 인터페이스로, [Man page용 그래픽 창, 모양 창(oclock) 및 여러 아이콘화된 창이 특징이다. 오른쪽 하단에는 단말 에뮬레이터가 유닉스 셸을 실행하고 있으며, 사용자는 마치 단말기에 앉아 있는 것처럼 명령을 입력할 수 있다.]]

운영체제 **셸**(shell)은 실행 중인 시스템에 상대적으로 광범위하고 직접적인 접근을 제공하는 컴퓨터 프로그램이다. 셸이라는 용어는 운영체제를 둘러싼 상대적으로 얇은 추상화 계층이라는 점에서 유래한다.

대부분의 셸은 명령줄 인터페이스(CLI) 프로그램이다. 일부 그래픽 사용자 인터페이스(GUI)에도 셸이 포함되어 있다.

## 개요
운영체제는 파일 관리, 프로세스 관리(응용 프로그램 실행 및 종료), 일괄 처리, 운영체제 모니터링 및 구성 등 다양한 서비스를 사용자에게 제공한다.

대부분의 운영체제 셸은 컴퓨터에 직접 연결된 주변 장치를 통해 셸이 사용자와 통신하더라도 기본 커널에 대한 직접적인 인터페이스가 아니다. 셸은 실제로 다른 응용 프로그램이 사용하는 것과 동일한 방식으로 커널 API를 사용하는 특수 응용 프로그램이다. 셸은 사용자에게 입력을 요청하고, 입력을 해석한 다음, 기본 운영체제에서 출력을 처리하여 사용자-시스템 상호 작용을 관리한다(읽기-평가-출력 반복, REPL과 매우 유사). 운영체제 셸은 실제로 응용 프로그램이기 때문에 대부분의 운영체제에서는 다른 유사한 응용 프로그램으로 쉽게 교체할 수 있다.

로컬 시스템에서 실행되는 셸 외에도 원격 시스템을 로컬 사용자에게 제공하는 다양한 방법이 있으며, 이러한 접근 방식은 일반적으로 원격 접근 또는 원격 관리라고 한다. 처음에는 메인프레임에서 다중 사용자에게 직렬선 또는 모뎀을 통해 메인프레임에 연결된 텍스트 터미널을 통해 각 활성 사용자에게 동시에 텍스트 기반 UI를 제공하는 데 사용되었으며, 원격 접근은 유닉스 계열 시스템 및 마이크로소프트 윈도우로 확장되었다. 유닉스 계열 시스템에서는 일반적으로 텍스트 기반 셸에 시큐어 셸 프로토콜(SSH)이 사용되며, SSH 터널링은 X 윈도 시스템 기반 그래픽 사용자 인터페이스(GUI)에 사용될 수 있다. 마이크로소프트 윈도우에서는 윈도우 비스타 이후 원격 데스크톱 프로토콜을 사용하여 GUI 원격 접근을 제공할 수 있으며, 윈도우 10 빌드 1809 이후 파워셸 원격, SSH도 WMI, RPC 및 WS-Management를 통해 텍스트 기반 원격 접근에 사용될 수 있다.

대부분의 운영체제 셸은 명령줄 및 그래픽의 두 가지 범주 중 하나에 속한다. 명령줄 셸은 운영체제에 명령줄 인터페이스(CLI)를 제공하고, 그래픽 셸은 그래픽 사용자 인터페이스(GUI)를 제공한다. 흔하지는 않지만 음성 사용자 인터페이스와 텍스트 기반 메뉴 시스템과 같이 CLI가 아닌 텍스트 기반 사용자 인터페이스(TUI)의 다양한 구현과 같은 다른 가능성도 있다. CLI 기반 셸과 GUI 기반 셸의 상대적인 장점은 종종 논쟁의 대상이 된다. 많은 컴퓨터 사용자는 수행해야 하는 작업에 따라 둘 다 사용한다.

## 역사
초기 대화형 시스템은 레지던트 모니터의 일부로 간단한 명령줄 인터프리터를 제공했다. 이 인터프리터는 DEC TOPS-10 시스템에서 `COMCON`과 같은 다른 이름으로 불릴 수 있었다. 인터프리터는 미리 정의된 여러 명령 중 하나를 실행하며, 그 중 하나는 사용자 프로그램을 실행하는 것이었다. 일반적인 명령은 사용자를 시스템에 로그인 및 로그오프하고, 장치와 파일을 할당, 해제 및 조작하고, 시스템 또는 사용자 프로세스에 대한 다양한 정보를 쿼리하는 것이었다.

1964년 멀틱스 운영체제에서 루이 푸진은 "명령을 프로그래밍 언어처럼 사용하는" 아이디어를 구상하고 이를 설명하기 위해 셸이라는 용어를 만들었다. 1965년 문서에서 셸은 "사용자가 콘솔에 메시지를 입력할 때, 콘솔 제어 하에 활성화된 다른 프로세스가 없을 때 수퍼바이저가 자동으로 호출하는 공통 절차. 이 절차는 콘솔 메시지와 수퍼바이저의 서브루틴 사이의 인터페이스 역할을 한다"고 정의되어 있다. 이 시스템은 글렌다 슈뢰더와 제너럴 일렉트릭의 이름 없는 한 남자에 의해 처음 구현되었다.

멀틱스는 또한 일부 후기 셸의 핵심 개념인 액티브 함수를 도입했다. 이는 라고 정의된다.

1971년 켄 톰프슨은 유닉스 첫 번째 버전에서 톰프슨 셸을 개발했다. 멀틱스 셸보다 단순했지만, 를 입출력 리다이렉션에 사용하는 것을 포함하여 현대 셸에 전해진 몇 가지 혁신적인 기능을 포함했다.

그래픽 셸은 1968년 12월 샌프란시스코에서 열린 폴 합동 컴퓨터 회의에서 모든 데모의 어머니라고 불리는 더글러스 엥겔바트의 NLS 시스템에서 처음 등장했다. 스탠퍼드 연구소의 엥겔바트 동료들은 이 개념을 제록스 팔로 알토 연구 센터(PARC)로 가져갔고, 1973년에 출시된 알토에 등장했다. 그곳에서 이 아이디어는 1980년 니클라우스 비르트의 릴리스와 1983년 애플 리사로 퍼져나갔고, 이후 유비쿼터스화되었다.

## 명령줄 셸

[섬네일|right|upright=1.7|윈도우의 CLI 셸인 [윈도우 명령 프롬프트|명령 프롬프트]]
[섬네일|right|upright=1.7|널리 채택된 [유닉스 셸인 Bash]]
명령줄 인터페이스(CLI)는 키보드로 입력한 영숫자 문자를 사용하여 운영체제에 대화식으로 명령과 데이터를 제공하는 운영체제 셸이다. 예를 들어, 전신 타자기는 키 입력을 나타내는 코드를 컴퓨터에서 실행되는 명령 인터프리터 프로그램으로 보낼 수 있다. 명령 인터프리터는 키 입력 시퀀스를 구문 분석하고 문자 시퀀스를 인식할 수 없으면 오류 메시지로 응답하거나 응용 프로그램 로드, 파일 목록, 사용자 로그인 등 다른 프로그램 작업을 수행할 수 있다. UNIX와 같은 운영체제에는 다양한 명령, 구문 및 기능을 가진 다양한 셸 프로그램이 있으며, POSIX 셸이 기본이다. 일부 운영체제에는 단일 스타일의 명령 인터페이스만 있었다. MS-DOS와 같은 상용 운영체제는 표준 명령 인터페이스(COMMAND.COM)와 함께 제공되었지만, 메뉴 또는 원격 프로그램 실행과 같은 추가 기능 또는 기능을 제공하는 타사 인터페이스도 종종 사용 가능했다.

응용 프로그램도 명령줄 인터페이스를 구현할 수 있다. 예를 들어, 유닉스 계열 시스템에서 텔넷 프로그램은 원격 컴퓨터 시스템에 대한 링크를 제어하는 여러 명령을 가지고 있다. 프로그램에 대한 명령이 원격 컴퓨터로 전송되는 데이터와 동일한 키 입력으로 구성되므로 둘을 구별하는 수단이 필요하다. 이스케이프 시퀀스는 절대 전달되지 않고 항상 로컬 시스템에 의해 해석되는 특수 로컬 키 입력을 사용하여 정의할 수 있다. 프로그램은 모달이 되어 키보드에서 명령을 해석하거나 키 입력을 처리할 데이터로 전달하는 것 사이를 전환한다.

많은 명령줄 셸의 기능은 재사용을 위해 명령 시퀀스를 저장하는 기능이다. 데이터 파일은 CLI가 사용자가 입력한 것처럼 따를 수 있는 명령 시퀀스를 포함할 수 있다. CLI가 이러한 저장된 명령을 수행할 때 특수 기능이 적용될 수 있다. 이러한 배치 파일(스크립트 파일)은 시스템이 재시작될 때 프로그램 세트를 초기화하는 것과 같은 일상적인 작업을 자동화하기 위해 반복적으로 사용될 수 있다. 셸의 배치 모드 사용은 일반적으로 프로그래밍 언어의 구조, 조건문, 변수 및 기타 요소를 포함한다. 일부는 이러한 목적에 필요한 기본적인 요소를 가지고 있고, 다른 일부는 그 자체로 매우 정교한 프로그래밍 언어이다. 반대로, 일부 프로그래밍 언어는 운영체제 셸에서 또는 특수 목적 프로그램에서 대화식으로 사용될 수 있다.

Nushell, Xonsh, 배시 (유닉스 셸) 및 Z 셸과 같은 여러 명령줄 셸은 사용자가 입력한 몇 글자를 기반으로 인터프리터가 명령을 확장할 수 있도록 하는 명령줄 완성 기능을 제공한다.

명령줄 인터프리터는 기록 기능을 제공하여 사용자가 시스템에 이전에 발행된 명령을 불러와 편집하여 반복할 수 있도록 할 수 있다. 운영체제에 대한 모든 명령은 사용자가 입력해야 했으므로, 짧은 명령 이름과 프로그램 옵션을 나타내는 간결한 시스템이 일반적이었다. 짧은 이름은 때때로 사용자가 기억하기 어려웠고, 초기 시스템에는 자세한 온라인 사용자 설명서를 제공할 저장 공간이 부족했다.

## 그래픽 셸

그래픽 사용자 인터페이스(GUI)는 창 열기, 닫기, 이동 및 크기 조정과 같은 작업을 허용하고 창 간의 포커스 전환을 허용하여 프로그램을 그래픽으로 조작할 수 있는 수단을 제공한다. 그래픽 셸은 데스크톱 환경에 포함되거나 별도로 제공될 수 있으며, 심지어 느슨하게 결합된 유틸리티 세트로도 제공될 수 있다.

대부분의 그래픽 사용자 인터페이스는 "전자 데스크톱"의 은유를 개발하며, 데이터 파일은 책상 위의 종이 문서처럼 표시되고, 응용 프로그램은 명령 이름으로 호출되지 않고 그래픽 표현을 갖는다.

### 유닉스 계열 시스템
[섬네일|upright=1.7|[KDE의 KDesktop과 Konqueror 간에 파일 그룹에 대한 드래그 앤드 드롭 작업]]
그래픽 셸은 일반적으로 윈도 시스템 위에 구축된다. X 윈도 시스템 또는 웨이랜드의 경우 셸은 각각 X 윈도 매니저 또는 웨이랜드 컴포지터로 구성되며, 설치된 응용 프로그램을 시작하고, 열린 창 및 가상 데스크톱을 관리하고, 종종 위젯 엔진을 지원하는 기능을 제공하는 하나 이상의 프로그램으로 구성된다. 그놈 셸과 KDE 플라스마는 X 윈도 시스템 및 웨이랜드용 그래픽 셸이다.

macOS의 경우 쿼츠 컴포지터가 윈도 시스템 역할을 하며, 셸은 파인더, Dock, SystemUIServer, 및 미션 컨트롤로 구성된다.

### 마이크로소프트 윈도우

마이크로소프트 윈도우 운영체제의 최신 버전은 윈도우 셸을 셸로 사용한다. 윈도우 셸은 데스크톱 환경, 시작 메뉴, 작업 표시줄뿐만 아니라 운영체제의 파일 관리 기능에 접근하기 위한 그래픽 사용자 인터페이스를 제공한다. 이전 버전에는 마이크로소프트 윈도우 3.x 시리즈의 셸이었고, 실제로 윈도우 XP까지 윈도우 95 및 NT 유형의 후기 버전과 함께 제공된 프로그램 관리자도 포함된다. 윈도우 버전 1과 2의 인터페이스는 현저히 달랐다.

데스크톱 응용 프로그램도 타사 엔진을 사용하는 한 셸로 간주된다. 마찬가지로 윈도우 탐색기 인터페이스에 불만을 품은 많은 개인과 개발자는 셸의 기능과 모양을 변경하거나 완전히 대체하는 소프트웨어를 개발했다. StarDock의 WindowBlinds는 전자의 좋은 예이다. LiteStep 및 Emerge Desktop은 후자의 좋은 예이다.

상호 운용성 프로그램과 특수 설계된 소프트웨어를 통해 윈도우 사용자는 아래에서 논의된 다양한 유닉스 기반 GUI 및 매킨토시와 동등한 기능을 사용할 수 있다. 윈도우 NT 버전에서 OS/2 환경 서브시스템을 사용하여 일부 조건에서 OS/2 Presentation Manager 3.0 버전에 해당하는 프로그램을 실행할 수 있다.

## 프로그램에서 호출
셸은 일반적으로 `system()`, `popen()` 및 `exec()`와 같은 표준 시스템 함수를 통해 사용자 인터페이스 없이 프로그램 내에서 호출될 수도 있다.

이러한 표준 함수 외에도 예를 들어 윈도우는 프로그램이 윈도우 셸과 상호 작용하는 데 사용할 수 있는 함수 집합을 노출하는 "윈도우 셸 API"를 제공한다. 이러한 셸 함수는 DLL(예: shell32.dll 및 shlwapi.dll)에서 제공되며 기본 윈도우 셸 GUI(즉, explorer.exe)가 실행될 필요가 없다. Explorer.exe 및 그 대체 프로그램은 일반적으로 윈도우 셸 API를 사용하여 사용자에게 윈도우 셸 GUI를 제공하며 윈도우 셸 핵심 기능(shell32.dll 및 shlwapi.dll에서 구현 및 제공됨)을 직접 구현할 필요가 없다. 그러나 프로그램은 윈도우 셸 API를 다른 목적으로 사용하거나 사용자에게 셸 사용자 인터페이스를 제공하지 않고도 사용할 수 있다.

## 기타 용도
"셸"은 자연에서 발견되는 셸에 비유하여 웹 브라우저 및 이메일 클라이언트와 같은 특정 구성 요소를 "둘러싸는" 응용 소프트웨어를 느슨하게 설명하는 데도 사용된다. 실제로 (명령줄) 셸은 운영체제 커널을 캡슐화한다. 이것들은 때때로 "래퍼"라고도 불린다.

전문가 시스템에서 셸은 특정 응용 프로그램에 대한 지식 기반이 없는 "빈" 전문가 시스템인 소프트웨어 조각이다.

## 같이 보기

* 
* 
* 
* 
* 
* 
* 
* 
* 

## 각주


분류:데스크톱 환경