맨위로가기

톰프슨 셸

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

톰프슨 셸은 유닉스의 초기 셸로, 명령 줄 인터페이스를 통해 운영 체제와 상호 작용하는 방식을 정의하는 데 기여했다. 1971년 유닉스 첫 번째 버전에 도입된 이 셸은 입출력 리다이렉션, 파이프 기능 등을 제공하며, 단순한 설계로 인해 다른 유닉스 셸 및 도스, OS/2, 윈도우 등 여러 운영 체제의 셸에 영향을 미쳤다. 그러나 1970년대 후반, 본 셸과 C 셸의 등장으로 인해 점차 사용되지 않게 되었으며, 현재는 역사적인 자료로 남아있다.

더 읽어볼만한 페이지

  • 유닉스 셸 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
  • 유닉스 셸 - 본 셸
    본 셸은 스티븐 본이 개발하여 1979년 유닉스에 포함된 셸로, 셸 스크립트, 제어 흐름, 변수, 시그널 처리 등의 기능을 제공하며 여러 셸에 영향을 주었고 현재도 널리 사용된다.
톰프슨 셸 - [IT 관련 정보]에 관한 문서
개요
종류유닉스 셸
개발자켄 톰프슨
발표일1971년
운영 체제유닉스 및 유닉스 계열 운영 체제
상세 정보
특징최초의 유닉스 셸, 이후 셸들의 기반이 됨
영향본 셸 등 여러 셸에 영향

2. 역사

명령 줄 인터프리터에 "셸"이라는 이름을 붙이고, 이를 OS 커널 밖의 사용자 인터페이스로 제공한다는 개념은 Multics에서 시작되어, Unix에 앞서 등장했다. 톰프슨 셸은 멀틱스의 영향을 받아 개발되었으며, 초기에는 입출력 리다이렉션과 파이프 기능이 도입되었다.

톰프슨 셸의 초기 버전에서 사용된 리다이렉션 및 파이프 구문은 이후 개선을 거쳐 현재와 같은 형태로 발전했다. 특히, `<` 및 `>`를 사용한 리다이렉션과 `|`를 사용한 파이프 구문은 톰프슨 셸에서 확립된 이후 도스, OS/2, 마이크로소프트 윈도우 등 다른 여러 운영 체제에도 영향을 주었다.

2. 1. 초기 기능

명령 줄 인터프리터에서 셸(shell)이라는 이름과 셸을 운영 체제 커널 밖의 사용자 프로그램으로 만든다는 개념은 유닉스의 선구자 멀틱스에서 도입되었다.

톰프슨 셸의 초기 기능은 입출력 리다이렉션을 위한 간략한 문법이었다. 멀틱스에서 명령의 입출력을 리다이렉트하려면 리다이렉션을 시작하고 중단하기 위한 별도의 프로그램이 필요하였다. 유닉스에서는 `<` 기호와 함께 입력 파일명을, `>` 기호와 함께 출력 파일명을 명령 줄에 추가하면 셸이 해당 명령을 실행하는 동안 입출력을 리다이렉트했다. 이러한 문법은 1971년 최초 버전의 유닉스 릴리스에 이미 존재하였다.

나중에 파이프 개념이 추가되었다. 더글러스 매클로이의 제안으로 리다이렉션 문법이 확장되어 한 명령의 출력이 다른 명령의 입력으로 전달될 수 있었다. 버전 3 매뉴얼에 기술된 원래 파이프 문법은 다음과 같았다.

`명령1 >명령2>`

이 문법은 파일 리다이렉션과 혼동하기 쉬워 모호하다는 것이 밝혀졌다. 시스템은 "명령2"가 명령어인지 파일명인지 구별할 수 없었다. 버전 4에서 이 문법은 `|` 및 `^` 기호를 모두 사용하여 파이프를 지시하도록 변경되었다.

`명령1 | 명령2`

이는 다음과 동일한 결과이다.

`명령1 ^ 명령2`

`>` 기호는 다음과 같이 변경되었다.

`command1 > file1`

이렇게 하면 명령1의 출력은 파일1에 추가된다.

`<` 및 `>`를 사용한 리다이렉션과 `|`를 사용한 파이프의 톰프슨 셸 문법은 견고하여 다른 대부분의 유닉스 셸과 일부 다른 운영 체제의 셸(특히 도스, OS/2, 마이크로소프트 윈도우)에 채택되었다.

2. 2. 파이프 기능 도입

명령 줄 인터프리터에서 셸(shell)이라는 이름과 셸을 운영 체제 커널 밖의 사용자 프로그램으로 만든다는 개념은 유닉스의 선구자인 멀틱스에서 도입되었다.

톰프슨 셸의 초기 기능은 입출력 리다이렉션을 위한 간략한 문법이었다. 멀틱스에서는 명령의 입출력을 리다이렉트하려면 리다이렉션을 시작하고 중단하기 위한 별도의 프로그램이 필요했다. 유닉스에서는 < 기호와 함께 파일명을 입력으로, > 기호와 함께 파일명을 출력으로 지정하는 인수를 명령 줄에 추가하면 셸이 해당 명령을 실행하는 동안 입출력을 리다이렉트했다. 이 문법은 1971년 최초 버전의 유닉스 릴리스에 이미 존재했다.

이후 파이프 개념이 추가되었다. 더글러스 매클로이의 제안으로 리다이렉션 문법이 확장되어, 한 명령의 출력을 다른 명령의 입력으로 전달할 수 있게 되었다. 버전 3 매뉴얼에 기술된 원래 파이프 문법은 다음과 같았다.

`명령1 >명령2>`

이 문법은 파일로 향하는 리다이렉션과 파일로부터 오는 리다이렉션을 쉽게 혼동하게 하여, 시스템이 "명령2"가 명령인지 파일인지 구별할 수 없다는 문제가 있었다. 버전 4에서 이 문법은 | 및 ^ 기호를 모두 사용하여 파이프를 지시하도록 변경되었다.

`명령1 | 명령2`

이는 다음과 정확히 동일하다.

`명령1 ^ 명령2`

`>` 기호는 다음과 같이 변경되었다.

`command1 > file1`

이는 명령1의 출력을 파일1에 추가한다.

< 및 >를 사용한 리다이렉션과 |를 사용한 파이프의 톰프슨 셸 문법은 다른 대부분의 유닉스 셸과 일부 다른 운영 체제의 셸(특히 도스, OS/2, 마이크로소프트 윈도우)에 채택되었다.

2. 3. 다른 운영 체제로의 확산

명령 줄 인터프리터에 "셸"이라는 이름을 붙이고, 셸을 운영 체제 커널 외부의 사용자 프로그램으로 만드는 개념은 유닉스의 선구자인 멀틱스에서 도입되었다.

톰프슨 셸의 초기 기능은 입출력 리다이렉션을 위한 간결한 구문이었다. 멀틱스에서는 명령의 입출력을 리다이렉션하려면 별도의 프로그램으로 리다이렉션을 시작하고 중지해야 했다. 유닉스에서는 `<` 기호와 파일 이름을 입력으로, `>` 기호와 파일 이름을 출력으로 하는 인수를 명령 줄에 추가하기만 하면 셸이 해당 명령이 실행되는 동안 입출력을 리다이렉션했다. 이 구문은 1971년 유닉스 첫 번째 버전이 출시될 때 이미 존재했다.

나중에 추가된 것은 파이프의 개념이었다. 더글러스 매킬로이의 제안에 따라 리다이렉션 구문이 확장되어 한 명령의 출력을 다른 명령의 입력으로 전달할 수 있게 되었다. 버전 3 매뉴얼에 설명된 원래 파이프 구문은 다음과 같았다.

`command1 >command2>`

이 구문은 모호성이 너무 많아 파일로의 리다이렉션과 쉽게 혼동될 수 있었다. 버전 4에서는 파이프를 나타내기 위해 `|` 와 `^` 기호를 모두 사용하는 구문으로 변경되었다.

`command1 | command2`

이 구문은 다음과 동일한 결과를 생성한다.

`command1 ^ command2`

`>` 기호는 다음과 같이 변경되었다.

`command1 > file1`

이 구문은 command1의 출력을 file1에 넣는다.

`<` 및 `>`를 사용한 리다이렉션과 `|`를 사용한 파이프에 대한 톰프슨 셸 구문은 지속력이 입증되었으며, 다른 대부분의 유닉스 셸과 여러 다른 운영 체제, 특히 도스, OS/2마이크로소프트 윈도우의 명령 셸에서 채택되었다.

3. 설계

톰프슨 셸의 설계는 멀틱스를 모방하여 만들어졌으며, 의도적으로 미니멀리즘을 따랐다.[1] 그 결과, 1975년에 Version 6 Unix가 출시될 무렵에는 톰프슨 셸이 본격적인 프로그래밍 작업에 부적합하다는 것이 분명해졌다.

이후 프로그래머 워크벤치 유닉스(Programmer's Workbench UNIX) 개발자, 특히 존 메이시(John Mashey)는 프로그래밍에 적합하게 만들기 위해 톰프슨 셸을 수정하기 시작했다.[7] PWB shell영어 또는 메이시 셸(Mashey shell)로 알려진 이 셸은 더 진보된 흐름 제어 기구를 포함하고 셸 변수를 도입했지만, 톰슨 셸과의 호환성 필요성 때문에 제한이 남았다.

결국 톰프슨 셸은 1979년 Version 7 Unix에서 Bourne Shell에, 2BSD에서는 C Shell에 메인 유닉스 셸 자리를 넘겨주게 되었다.

3. 1. 프로그램 흐름 제어

톰프슨 셸은 의도적으로 최소한의 기능만을 포함하도록 설계되었다. 프로그램 흐름 제어에 필수적인 `if` 및 `goto` 문조차 별도의 명령으로 구현되었다.[1]

셸은 `:` 명령을 제외하면 주석 기능이 없다. 프로그래머는 이 명령 뒤에 텍스트를 작성하면 되는데, 이 명령은 모든 매개변수를 무시하고 단순히 성공한다. 다른 내장 명령으로는 `chdir`, `exit`, `login`, `newgrp`, `shift`, `wait`가 있다.[5]

`if` 명령은 현대의 본 셸 `test` 및 `if`의 용도를 결합한다. 이 명령은 먼저 표현식(현대의 `test`와 유사하거나 외부 명령을 포함할 수 있음)을 찾은 다음, 조건이 참으로 판명될 경우 실행할 명령으로 명령줄의 나머지를 처리한다. `else` 분기는 없다.[2]

`goto`는 셸과 분리된 흥미로운 방식으로 구현되었다. "LABEL"로 점프하라는 요청을 받으면 현재 명령 파일에서 `: LABEL`이라고 적힌 줄을 찾은 다음(`:`는 단순히 무시됨) 종료한다. 셸이 다음 줄을 읽으려고 할 때, 재배치된 파일 디스크립터는 레이블이 지정된 위치로 안내한다.[3]

톰프슨 셸에서는 표준 입력 및 출력(0과 1) 외에 추가적인 파일 디스크립터의 리디렉션이 없다. 표준 에러(파일 디스크립터 2)의 리디렉션도 외부 프로그램 래퍼인 `fd2`가 필요하다.[4]

셸은 globbing을 지원하지만,[5] 실제로 인수를 대체하고 요청된 명령을 호출하는 `glob` 명령에 globbing을 위임하여 구현한다.[6]

톰프슨 셸은 위치 매개변수를 가지지만, 명명된 변수나 환경 변수 접근은 지원하지 않는다. 본 셸과 유사하게 `&`를 사용하여 백그라운드 명령의 생성을 이해한다. 인용과 백슬래시 이스케이프를 제공하지만, 작은 따옴표는 본 셸과 다르게 작동한다.[5]

프로그램의 흐름을 제어하는 데 필수적인 `if` 문이나 `goto` 문도 다른 명령으로 구현되었다.[7]

3. 2. 내장 명령

톰프슨 셸은 프로그램 흐름 제어에 필수적인 `if` 및 `goto` 문조차 별도의 명령으로 구현되었다.[1]

셸은 `:` 명령을 제외하면 주석 기능이 없다. 프로그래머는 이 명령 뒤에 텍스트를 작성하기만 하면 되며, 이 명령은 모든 매개변수를 무시하고 단순히 성공한다. 다른 내장 명령으로는 `chdir`, `exit`, `login`, `newgrp`, `shift`, `wait`가 있다.[5]

`if` 명령은 현대의 본 셸 `test` 및 `if`의 용도를 결합한다. 이 명령은 먼저 표현식(현대의 `test`와 유사하거나 외부 명령을 포함할 수 있음)을 찾은 다음, 조건이 참으로 판명될 경우 실행할 명령으로 명령줄의 나머지를 처리한다. `else` 분기는 없다.[2]

`goto`는 셸과 분리된 흥미로운 방식으로 구현되었다. "LABEL"로 점프하라는 요청을 받으면 현재 명령 파일에서 `: LABEL`이라고 적힌 줄을 찾은 다음(`:`는 단순히 무시됨) 종료한다. 셸이 다음 줄을 읽으려고 할 때, 재배치된 파일 디스크립터는 레이블이 지정된 위치로 안내한다.[3]

톰프슨 셸에서는 표준 입력 및 출력(0과 1) 외에 추가적인 파일 디스크립터의 리디렉션이 없다. 표준 에러(파일 디스크립터 2)의 리디렉션도 외부 프로그램 래퍼인 `fd2`가 필요하다.[4]

셸은 globbing을 지원하지만,[5] 실제로 인수를 대체하고 요청된 명령을 호출하는 `glob` 명령에 globbing을 위임하여 구현한다.[6]

톰프슨 셸은 위치 매개변수를 가지지만, 명명된 변수나 환경 변수 접근은 지원하지 않는다. 본 셸과 유사하게 `&`를 사용하여 백그라운드 명령의 생성을 이해한다. 인용과 백슬래시 이스케이프를 제공하지만, 작은 따옴표는 본 셸과 다르게 작동한다.[5]

3. 3. 기타 특징

톰프슨 셸의 설계는 의도적으로 미니멀리즘을 따랐다. 프로그램 흐름 제어에 필수적인 `if` 및 `goto` 문조차 별도의 명령으로 구현되었다.[1]

셸은 `:` 명령을 제외하면 주석 기능이 없다. 프로그래머는 이 명령 뒤에 텍스트를 작성하기만 하면 되며, 이 명령은 모든 매개변수를 무시하고 단순히 성공한다. 다른 내장 명령으로는 `chdir`, `exit`, `login`, `newgrp`, `shift`, 및 `wait`가 있다.[5]

`if` 명령은 현대의 본 셸 `test` 및 `if`의 용도를 결합한다. 이 명령은 먼저 표현식(현대의 `test`와 유사하거나 외부 명령을 포함할 수 있음)을 찾은 다음, 조건이 참으로 판명될 경우 실행할 명령으로 명령줄의 나머지를 처리한다. `else` 분기는 없다.[2]

`goto`는 셸과 분리된 흥미로운 방식으로 구현되었다. "LABEL"로 점프하라는 요청을 받으면 현재 명령 파일에서 `: LABEL`이라고 적힌 줄을 찾은 다음(`:`는 단순히 무시됨을 기억하라) 종료한다. 셸이 다음 줄을 읽으려고 할 때, 재배치된 파일 디스크립터는 레이블이 지정된 위치로 안내한다.[3]

톰프슨 셸에서는 표준 입력 및 출력(0과 1) 외에 추가적인 파일 디스크립터의 리디렉션이 없다. 표준 에러(파일 디스크립터 2)의 리디렉션도 외부 프로그램 래퍼인 `fd2`가 필요하다.[4]

셸은 globbing을 지원하지만,[5] 실제로 인수를 대체하고 요청된 명령을 호출하는 `glob` 명령에 globbing을 위임하여 구현한다.[6]

톰프슨 셸은 위치 매개변수를 가지지만, 명명된 변수나 환경 변수 접근은 지원하지 않는다. 본 셸과 유사하게 `&`를 사용하여 백그라운드 명령의 생성을 이해한다. 인용과 백슬래시 이스케이프를 제공하지만, 작은 따옴표는 본 셸과 다르게 작동한다.[5]

4. 쇠퇴와 대체

단순한 설계로 인해 1975년에 출시된 유닉스 버전 6에 이르러 톰프슨 셸은 대부분의 심각한 프로그래밍 작업에 부적합하다는 것이 분명해졌다.[1]

이 시기에 프로그래머 워크벤치 유닉스 배포판의 개발자들, 특히 존 매시를 중심으로 톰프슨 셸을 프로그래밍에 더 적합하도록 수정하기 시작했다.[1] PWB 셸 또는 매시 셸이라고 알려진 이 셸은 더 발전된 흐름 제어 메커니즘을 포함하고 셸 변수를 도입했지만, 톰프슨 셸과의 호환성을 유지해야 할 필요성으로 인해 제약이 있었다.

마침내 톰프슨 셸은 유닉스 버전 7의 본 셸과 2BSD의 C 셸로 메인 유닉스 셸의 자리를 내주었다. 이 두 셸 모두 1979년에 출시되었다. 거의 모든 현대 유닉스 및 유닉스 계열 시스템이 V7 및 2BSD에서 파생되었기 때문에 톰프슨 셸은 일반적으로 더 이상 사용되지 않는다. 그러나 여러 고대 유닉스 소스 배포판의 일부로 오픈 소스 소프트웨어로 제공되며, 역사적인 전시물로 현대 유닉스에 이식되었다.

5. 현재 상황

유닉스 버전 6에 이르러 톰프슨 셸은 단순한 설계로 인해 대부분의 심각한 프로그래밍 작업에 부적합하다는 것이 분명해졌다.[1] 존 매시를 중심으로 톰프슨 셸을 프로그래밍에 더 적합하도록 수정하기 시작했고,[1] 그 결과 PWB 셸 또는 매시 셸이라고 알려진 이 셸은 더 발전된 흐름 제어 메커니즘을 포함하고 셸 변수를 도입했지만, 톰프슨 셸과의 호환성을 유지해야 할 필요성으로 인해 제약이 있었다.

마침내 톰프슨 셸은 유닉스 버전 7의 본 셸과 2BSD의 C 셸로 메인 유닉스 셸의 자리를 내주었다. 이 두 셸 모두 1979년에 출시되었다. 거의 모든 현대 유닉스 및 유닉스 계열 시스템이 V7 및 2BSD에서 파생되었기 때문에 톰프슨 셸은 일반적으로 더 이상 사용되지 않는다. 그러나 여러 고대 유닉스 소스 배포판의 일부로 오픈 소스 소프트웨어로 제공되며, 역사적인 전시물로 현대 유닉스에 이식되었다.

참조

[1] 간행물 Using a Command Language as a High-Level Programming Language https://grosskurth.c[...] 1976-10-13
[2] 웹사이트 if(1) (html) - IF(1) - Manuals - Etsh Project (V6Shell) https://etsh.nl/man/[...]
[3] 웹사이트 goto(1) (html) - GOTO(1) - Manuals - Etsh Project (V6Shell) https://etsh.nl/man/[...]
[4] 웹사이트 fd2(1) (html) - FD2(1) - Manuals - Etsh Project (V6Shell) https://etsh.nl/man/[...]
[5] 웹사이트 tsh(1) (html) - TSH(1) - Manuals - Etsh Project (V6Shell) https://etsh.nl/man/[...]
[6] 웹사이트 glob(1) (html) - GLOB(1) - Manuals - Etsh Project (V6Shell) https://etsh.nl/man/[...]
[7] 논문 Using a Command Language as a High-Level Programming Language Proceeding of the 2nd International Conference on Software Engineering 1976-10-13
[8] 저널 Using a Command Language as a High-Level Programming Language null Proceedings of the 2nd International Conference on Software Engineering 1976-10-13



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com