tcsh и sh бок о бок на рабочем столе Mac OS X | |
Первоначальный автор (ы) | Билл Джой |
---|---|
Первый выпуск | 1978; 42 года назад (1978) |
Стабильный выпуск | 6.20.00 / 24 ноября 2016 г.; 3 года назад (24.11.2016) |
Репозиторий | |
Написано в | C |
Операционная система | BSD, UNIX, Linux, macOS |
Тип | оболочка Unix |
Лицензия | Лицензия BSD |
Оболочка C (csh или улучшенная версия, tcsh ) - это Оболочка Unix создана Биллом Джоем, когда он был аспирантом Калифорнийского университета в Беркли в конце 1970-х. Он получил широкое распространение, начиная с 2BSD-релиза Berkeley Software Distribution (BSD), который Joy впервые распространил в 1978 году. Другими ранними участниками идеи или кода были Майкл Убелл, Эрик Аллман., Майк О'Брайен и Джим Кулп.
Оболочка C - это командный процессор, который обычно запускается в текстовом окне, позволяя пользователю вводить команды. Оболочка C также может читать команды из файла, называемого скриптом. Как и все оболочки Unix, он поддерживает имя файла подстановочные знаки, конвейер, здесь документы, подстановку команд, переменные и управляющие структуры для проверки условий и итерация. Что отличало оболочку C от других, особенно в 1980-х, так это ее интерактивные возможности и общий стиль. Его новые функции сделали его проще и быстрее в использовании. Общий стиль языка больше походил на C и считался более читабельным.
Во многих системах, таких как macOS и Red Hat Linux, csh на самом деле является tcsh, улучшенной версией csh. Часто один из двух файлов представляет собой либо жесткую ссылку, либо символическую ссылку на другой, так что любое имя относится к одной и той же улучшенной версии оболочки C.
В Debian и некоторых производных (включая Ubuntu ) есть два разных пакета: csh и tcsh. Первый основан на оригинальной BSD-версии csh, а второй - это улучшенный tcsh.
tcsh добавил имя файла и концепции завершения команд и редактирования командной строки, заимствованные из системы Tenex, которая является источник "т". Поскольку он только добавлял функциональность и не менял того, что там было, tcsh оставался обратно совместимым с исходной оболочкой C. Хотя он начинался как побочная ветка от исходного дерева исходных текстов, созданного Джой, теперь tcsh является основной ветвью для продолжающейся разработки. tcsh очень стабилен, но новые выпуски продолжают появляться примерно раз в год, в основном с исправлениями мелких ошибок.
Основными целями разработки оболочки C было то, чтобы она больше походила на язык программирования C и была лучше для интерактивное использование.
Система Unix была написана почти исключительно на C, поэтому первой целью оболочки C был командный язык, который был более стилистически совместим с остальной системой. Ключевые слова, использование круглых скобок, грамматика встроенных выражений оболочки C и поддержка массивов - все это находилось под сильным влиянием C.
По сегодняшним стандартам оболочка C может показаться не особенно похожей на C, чем многие другие. другие популярные языки сценариев. Но на протяжении 80-х и 90-х годов разница казалась поразительной, особенно по сравнению с оболочкой Bourne (также известной как sh), доминирующей в то время оболочкой, написанной Стивеном Борном в Bell Labs. Этот пример иллюстрирует более традиционные операторы выражения оболочки C и синтаксис.
Bourne shell #! / Bin / sh if [$ days -gt 365] then echo Это больше года. fi | Оболочка C #! / bin / csh if ($ days>365) then echo Это больше года. endif |
В Bourne sh отсутствовала грамматика выражений. Условие в квадратных скобках должно было быть оценено более медленными средствами выполнения внешней программы test. sh , если команда
приняла свои аргументы слова как новую команду, которая будет запущена как дочерний процесс. Если дочерний процесс завершился с нулевым кодом возврата , sh будет искать предложение then (отдельный оператор, но часто записываемый в одной строке с точкой с запятой) и запускать этот вложенный блок. В противном случае он запустил бы else. Жесткое связывание тестовой программы как «test
» и «[
» дало преимущество квадратных скобок в обозначениях и создавало впечатление, что функциональность теста часть языка sh. Использование в sh ключевого слова reversed для обозначения конца блока управления было стилем, заимствованным из ALGOL 68.
Напротив, csh могла вычислять выражение напрямую, что делало его быстрее. Он также заявил о лучшей читабельности: в его выражениях использовалась грамматика и набор операторов, в основном скопированных с C, ни одно из его ключевых слов не было перевернуто, и общий стиль также был больше похож на C.
Здесь это второй пример сравнения скриптов, которые вычисляют первые 10 степеней 2.
Оболочка Борна #! / bin / sh i = 2 j = 1, а [$ j -le 10] do echo '2 ** '$ j = $ ii = ʻexpr $ i' * '2` j = ʻexpr $ j + 1` done | C shell #! / bin / csh set i = 2 set j = 1 while ( $ j <= 10) echo '2 **' $j = $i @ i *= 2 @ j++ end |
Опять же, из-за отсутствия грамматики выражений, сценарий sh использует подстановку команд и команду expr (современная оболочка POSIX имеет такая грамматика: оператор может быть записан i = $ ((i * 2))
или : $ ((i * = 2))
.)
Наконец, вот третий пример, показывающий разные стили для оператора switch.
Bourne shell #! / Bin / sh for i in d * do case $ i in d?) Echo $ i is короткая ;; *) echo $ i is long ;; esac done | C shell #! / bin / csh foreach i (d *) switch ($ i) case d ?: echo $ i короткий breaksw по умолчанию: echo $ i длинный endw end |
In сценарий sh «;;
» отмечает конец каждого случая, поскольку в противном случае sh запрещает пустые операторы.
Вторая цель заключалась в том, чтобы оболочка C была лучше для интерактивного использования. Он представил множество новых функций, которые сделали его проще, быстрее и дружественнее для использования путем ввода команд на терминале. Пользователи могли выполнять задачи с меньшим количеством нажатий клавиш, и он работал быстрее. Наиболее важными из этих новых функций были механизмы истории и редактирования, псевдонимы, стеки каталогов, тильда, cdpath, управление заданиями и хеширование пути. Эти новые функции оказались очень популярными, и с тех пор многие из них были скопированы другими оболочками Unix.
!!
», введенные как команда и обозначаемые как «бац, бац», вызывают выполнение предыдущей команды. Другие комбинации коротких нажатий клавиш, например, «! $
» для обозначения только последнего аргумента предыдущей команды, позволяют вставлять фрагменты предыдущих команд вместе и редактировать их для создания новой команды.~
".cd
(изменить каталог): если указанный каталог не находится в текущем каталоге, csh попытается найти его в каталогах cdpath.^Z
. Затем пользователь мог переключаться между заданиями с помощью команды fg. Говорилось, что на переднем плане активная работа. Другие задания были либо приостановлены (остановлены), либо выполняются в фоновом режиме .rehash
.Оболочка C работает по одной строке за раз. Каждая строка токенизируется в набор слов, разделенных пробелами или другими символами со специальным значением, включая круглые скобки, конвейеры и операторы перенаправления ввода / вывода, точки с запятой и амперсанды.
Базовые операторы - это те, которые просто запускают команду. Первое слово используется как имя команды, которая должна быть запущена, и может быть либо внутренней командой, например, echo
, либо внешней командой. Остальные слова передаются команде как аргументы.
На базовом уровне операторов вот некоторые особенности грамматики:
*
соответствует любому количеству символов.?
соответствует любому одиночному символу.[
... ]
соответствует любому из символов в квадратных скобках. Допускаются диапазоны с использованием дефиса.[^
... ]
соответствует любому символу, отсутствующему в наборе.abc {def, ghi}
- это чередование (также известное как расширение скобок ) и заменяется на abcdef abcghi.~
означает домашний каталог текущего пользователя.~ user
означает домашний каталог пользователя.* / *.c
", поддерживаются.** / *. C
» или «*** / *. Html
») также поддерживается с параметром globstar
.>
файл означает, что стандартный вывод будет записан в файл, перезаписывая его, если он существует, и создавая его, если нет. Ошибки по-прежнему поступают в окно оболочки.>
файл означает, что и stdout, и stderr будут записаны в файл, перезаписывая его, если он существует, и создавая его, если нет.>>
file означает, что stdout будет будет добавлен в конец файла.>>
файл означает, что и stdout, и stderr будут добавлены в конец файла.<
file означает, что stdin будет считан из файла.<<
строка является здесь документ. Stdin будет читать следующие строки вплоть до той, которая соответствует строке.;
означает выполнение первой команды, а затем следующей.
означает выполнение первой и, если она завершилась успешно с кодом возврата 0 , запустить следующую.||
означает выполнить первую команду, а в случае сбоя с ненулевым кодом возврата выполнить следующую.|
означает подключение stdout к stdin следующей команды. Ошибки по-прежнему поступают в окно оболочки.|
означает подключение как stdout, так и stderr к stdin следующей команды.a | b
», оболочка создает канал, затем запускает оба a
и b
с stdio для двух команд, перенаправленных так, что a
записывает свой stdout во вход канала, а b
читает stdin из выхода канала. Каналы реализуются операционной системой с определенной степенью буферизации, так что a
может какое-то время писать, прежде чем канал заполнится, но как только канал заполнится, любая новая запись будет блокироваться внутри ОС до b
читает достаточно, чтобы разблокировать новые записи. Если b
пытается прочитать больше данных, чем доступно, он будет блокироваться до тех пор, пока a
не запишет больше данных или пока канал не закроется, например, если a
завершится.$
», следующие символы принимаются как имя переменной, а ссылка заменяется значением этой переменной. Различные операторы редактирования, вводимые в виде суффиксов к ссылке, позволяют редактировать путь (например, «: e
» для извлечения только расширения) и другие операции.\
означает принимать следующий символ как обычный буквальный символ."
строка "
- слабая кавычка. Заключенные пробелы и подстановочные знаки принимаются как литералы, но подстановки переменных и команд по-прежнему выполняются.'
string '
- строгие кавычки. Вся заключенная строка принимается как литерал.`
команда `
означает взять вывод команды, разобрать его на слова и вставить их обратно в командную строку.
означает запуск команды в фоновом режиме и немедленный запрос новой команды.(
commands )
означает запуск команд в подоболочке.Оболочка C предоставляет управляющие структуры как для проверки условий, так и для итерации. Управляющими структурами проверки условий являются операторы if и switch. Структуры управления итерацией - это операторы while, foreach и repeat.
Существует две формы оператора if. Краткая форма набирается на одной строке, но может указывать только одну команду, если выражение истинно.
if (выражение ) команда
В длинной форме используются ключевые слова then, else и endif, позволяющие вставлять блоки команд внутри условия.
if (выражение1 ), затем команды else if (выражение2 ) затем команды... else команды endif
Если ключевые слова else и if появляются в одной строке, csh объединяет их в цепочки, а не вкладывает их; блок завершается одним endif.
Оператор switch сравнивает строку со списком шаблонов, который может содержать символы подстановки. Если ничего не совпадает, выполняется действие по умолчанию, если оно есть.
переключатель (строка )case pattern1 : commands breakswcase pattern2 : commands breaksw ... по умолчанию: commands breakswENDW
Оператор while оценивает выражение. Если это правда, оболочка выполняет вложенные команды, а затем повторяет их, пока выражение остается истинным.
while (выражение ) commands end
Оператор foreach принимает список значений, обычно список имен файлов, созданных с помощью подстановочных знаков, а затем для каждого устанавливает переменную цикла на это значение и запускает вложенные команды.
foreach переменная цикла (список-значений ) команды конец
Оператор повтора повторяет одну команду целое число раз.
repeat целочисленная команда
Оболочка C реализует как переменные оболочки, так и переменные среды. Environ переменные, созданные с помощью оператора setenv
, всегда представляют собой простые строки, передаваемые любым дочерним процессам , которые получают эти переменные через envp
аргумент main ()
.
Переменные оболочки, созданные с помощью операторов set
или @
, являются внутренними для оболочки C. Они не передаются дочерним процессам. Переменные оболочки могут быть простыми строками или массивами строк. Некоторые из переменных оболочки предопределены и используются для управления различными внутренними параметрами оболочки C, например, что должно произойти, если подстановочный знак не соответствует чему-либо.
В текущих версиях csh строки могут иметь произвольную длину, вплоть до миллионов символов.
Оболочка C реализует грамматику 32-битных целочисленных выражений с операторами, заимствованными из C, но с несколькими дополнительными операторами для сравнения строк и тестов файловой системы, например, проверки на наличие файл. Операторы должны отделяться от своих операндов пробелами. Переменные обозначаются как $
name.
Приоритет операторов также заимствован из C, но с другими правилами ассоциативности операторов для разрешения неоднозначности того, что идет первым в последовательности операторов с одинаковым приоритетом. В C ассоциативность для большинства операторов слева направо; в оболочке C - справа налево. Например,
// C группирует слева int i = 10/5 * 2; printf ("% d \ n", я); // выводит 4 i = 7-4 + 2; printf ("% d \ n", я); // выводит 5 i = 2>>1 << 4; printf( "%d\n", i); // prints 16 | # Группы оболочки C справа @ i = 10/5 * 2 echo $ i # выводит 1 @ i = 7-4 + 2 echo $ i # выводит 1 @ i = (2>>1 << 4) echo $i # prints 0 |
Скобки в примере оболочки C предназначены для того, чтобы операторы битового сдвига не путались с операторами перенаправления ввода-вывода. На любом языке круглые скобки всегда могут использоваться для явного указания желаемого порядка оценки., даже если только для ясности.
Хотя Стивен Борн сам признал, что csh лучше его оболочки для интерактивного использования, он никогда не был так популярен для написания сценариев Изначально и до 1980-х годов нельзя было гарантировать наличие csh во всех Unix-системах, но sh могла, что сделало его лучшим выбором для любых сценариев, которые, возможно, придется запускать на других машинах. К середине 1990-х годов csh был широко доступен, но использование csh для написания сценариев столкнулось с новой критикой со стороны комитета POSIX, который указал, что должна быть только одна предпочтительная оболочка, KornShell, как для интерактивных целей, так и для сценариев. Оболочка C также подвергалась критике со стороны других по поводу предполагаемых дефектов синтаксиса, отсутствующих функций и плохой реализации оболочки C.
set
, setenv
и alias
в основном делали одно и то же, а именно связывали имя со строкой или набором слов. Но у всех троих были небольшие, но ненужные различия. Знак равенства требовался для набора
, но не для setenv
или псевдонима
; круглые скобки должны были заключаться в список слов для набора
, но не для setenv
или псевдонима
и т. д. Аналогично, if
, switch
и конструкции цикла используйте излишне разные ключевые слова (endif
, ENDW
и end
) для завершения вложенных блоков.Он работал для большинства интерактивно вводимых команд, но для более сложных команд, которые пользователь мог написать в сценарии, он мог легко выйти из строя, выдав только загадочное сообщение об ошибке или нежелательный результат. Например, оболочка C не может поддерживать трубопровод между управляющими структурами. Попытка передать вывод команды foreach
по конвейеру в grep
просто не сработала. (Обход, который работает для многих жалоб, связанных с синтаксическим анализатором, состоит в том, чтобы разбить код на отдельные сценарии. Если foreach
перемещается в отдельный сценарий, конвейер работает, потому что сценарии выполняются путем создания новой копии csh, которая наследует правильные дескрипторы stdio.)
Другой пример - нежелательное поведение в следующих фрагментах. Оба они означают: «Если« myfile »не существует, создайте его, написав в нем« mytext »». Но версия справа всегда создает пустой файл, потому что порядок оценки оболочки C заключается в поиске и оценке операторов перенаправления ввода-вывода в каждой командной строке по мере ее чтения, прежде чем проверять остальную часть строки, чтобы увидеть, содержит ли она структура управления.
# Работает должным образом if (! -E myfile) then echo mytext>myfile endif | # Всегда создает пустой файл, если (! -E myfile) echo mytext>myfile | # Обходной путь if (! -E myfile) eval "echo mytext>myfile" |
Реализация также подвергается критике за ее заведомо плохие сообщения об ошибках, например, «0 событие не найдено», что не дает полезной информации о проблеме.
Оболочка C оказалась чрезвычайно успешной в плане внедрения большого количества инноваций включая механизм history, псевдонимы, нотацию тильды, интерактивное завершение имени файла, грамматику выражений, встроенную в оболочку, и многое другое, что с тех пор было скопировано другими Оболочки Unix. Но в отличие от sh, который породил большое количество независимо разработанных клонов, включая ksh и bash, только два клона csh известны. (Поскольку tcsh был основан на коде csh, первоначально написанном Биллом Джоем, он не считается клоном.)
В 1986 году Аллен Голуб написал по команде: Написание Unix-подобной оболочки для MS-DOS, книги, описывающей написанную им программу под названием «SH», но фактически скопировавшую структуру языка и особенности csh, а не sh. Сопутствующие дискеты, содержащие полный исходный код SH и базовый набор Unix-подобных утилит (cat, cp, grep и т. Д.), Были доступны у издателя за 25 и 30 долларов соответственно. Управляющие структуры, грамматика выражений, механизм истории и другие функции в SH Holub были идентичны таковым в оболочке C.
В 1988 году компания Hamilton Laboratories начала поставки оболочки Hamilton C для OS / 2. Он включал в себя клон csh и набор утилит, подобных Unix. В 1992 году была выпущена оболочка Hamilton C для Windows NT. Версия для Windows по-прежнему активно поддерживается, но версия OS / 2 была прекращена в 2003 году. В кратком справочнике начала 1990 года цель описывалась как «полное соответствие всему языку оболочки C (кроме управление заданиями )», но с улучшением языкового дизайна и адаптацией к различиям между Unix и ПК. Самым важным улучшением был нисходящий синтаксический анализатор, который позволял управляющих структур быть вложенными или передаваемыми по конвейеру, что не могла поддерживать исходная оболочка C, учитывая ее специальный анализатор. Гамильтон также добавил новые языковые функции, включая встроенные и определяемые пользователем процедуры, блочные локальные переменные и арифметику с плавающей запятой. Адаптация к ПК включала поддержку имени файла и других соглашений на ПК и использование потоков вместо вилок (которые были недоступны ни в OS / 2, ни в Windows) для достижения параллелизм, например, при настройке конвейера.
В Викиучебнике есть книга по теме: Сценарии оболочки C |