Оболочка Томпсона была первой оболочкой Unix , представленной в первой версии Unix в 1971 году и написанной Кеном Томпсоном . [1] Это был простой интерпретатор команд, не предназначенный для написания скриптов, но тем не менее вносивший несколько инновационных функций в интерфейс командной строки и приведший к разработке более поздних оболочек Unix.
Название «shell» для интерпретатора командной строки и концепция создания оболочки как пользовательской программы вне ядра операционной системы были введены в предшественнике Unix — Multics .
Ранней особенностью оболочки Thompson был компактный синтаксис для перенаправления ввода/вывода . В Multics перенаправление ввода или вывода команды требовало отдельных команд для запуска и остановки перенаправления; в Unix можно было просто добавить аргумент в командную строку, состоящий из символа <, за которым следовало имя файла для ввода или символа > для вывода, и оболочка перенаправляла ввод/вывод на время выполнения команды. Этот синтаксис уже присутствовал к выпуску первой версии Unix в 1971 году.
Более поздним дополнением стала концепция каналов . По предложению Дугласа Макилроя синтаксис перенаправления был расширен таким образом, чтобы вывод одной команды мог быть передан на вход другой команды. Первоначальный синтаксис канала, описанный в руководстве версии 3, был следующим:
команда1 >команда2>
Этот синтаксис оказался слишком неоднозначным и его легко было спутать с перенаправлением в файлы и из файлов — система не могла определить, является ли «command2» командой «command2» или файлом «command2». К версии 4 синтаксис изменился, чтобы использовать символы | и ^ для обозначения каналов:
команда1 | команда2
Это дает точно такой же результат, как:
команда1 ^ команда2
Символ > изменился на:
команда1 > файл1
Это поместит вывод команды command1 в файл file1.
Синтаксис оболочки Томпсона для перенаправления с помощью < и > и конвейеризации с помощью | оказался надежным и был принят большинством других оболочек Unix и командными оболочками нескольких других операционных систем, в первую очередь в DOS , OS/2 и Microsoft Windows .
Дизайн оболочки был намеренно минималистичным; даже операторы if и goto , необходимые для управления потоком программы, были реализованы как отдельные команды. [1]
Оболочка не имеет возможностей для комментариев, кроме встроенной команды :
. Программисты просто пишут текст после этой команды, которая игнорирует все параметры и просто выполняется. Другие встроенные команды включают chdir
, exit
, login
, newgrp
, shift
, и wait
. [2]
Команда if объединяет использование современного Bourne shell test и if . Команда сначала ищет выражение (которое может быть похоже на современный test или включать внешнюю команду), а затем обрабатывает остальную часть командной строки как команду для выполнения, если условие оказывается истинным. Ветвь else отсутствует . [3]
goto реализован интересным образом, поскольку он отделен от оболочки. Когда его просят перейти к "LABEL", он ищет в текущем командном файле строку, которая говорит : LABEL
(напомним, что она :
просто игнорируется), а затем выходит. Когда оболочка пытается прочитать следующую строку, перепозиционированный файловый дескриптор направит ее в помеченное местоположение. [4]
В оболочке Томпсона нет перенаправления дополнительных файловых дескрипторов, кроме стандартного ввода и вывода (0 и 1). Перенаправление stderr (файловый дескриптор 2) также требует внешней программы-обертки, fd2
. [5]
Оболочка поддерживает подстановку [2] , но фактически реализует ее, передавая ее команде glob
, которая заменяет аргументы и вызывает запрошенную команду. [6]
Оболочка Thompson имеет позиционные параметры, но не имеет именованных переменных и доступа к переменным окружения. Она понимает создание фоновых команд с помощью &
, аналогично оболочке Bourne. Она предлагает экранирование кавычек и обратную косую черту, хотя одинарные кавычки работают иначе, чем в оболочке Bourne. [2]
В результате упрощенного дизайна к моменту выхода в 1975 году версии 6 Unix стало ясно, что оболочка Томпсона неадекватна для большинства серьезных задач программирования.
В это время разработчики дистрибутива Programmer's Workbench UNIX , в первую очередь Джон Маши , начали модифицировать оболочку Thompson, чтобы сделать ее более подходящей для программирования. [1] Результат, известный как оболочка PWB или оболочка Mashey, включал в себя более продвинутые механизмы управления потоком и вводил переменные оболочки, но оставался ограниченным необходимостью оставаться совместимым с оболочкой Thompson.
Наконец, оболочка Thompson была заменена в качестве основной оболочки Unix оболочкой Bourne в версии 7 Unix и оболочкой C в 2BSD , обе выпущены в 1979 году. Поскольку практически все современные Unix и Unix-подобные системы произошли от V7 и 2BSD, оболочка Thompson, как правило, больше не используется. Однако она доступна как open-source как часть нескольких дистрибутивов Ancient Unix и была перенесена на современные Unix в качестве исторического экспоната.