C shell
C shell (csh) — это командная оболочка (интерпретатор команд) для операционных систем семейства Unix, разработанная Биллом Джоем в конце 1970-х годов. Отличается синтаксисом, напоминающим язык программирования C, и расширенными возможностями для интерактивной работы, такими как история команд, редактирование командной строки, псевдонимы (алиасы) и управление заданиями. Является одной из старейших и наиболее влиятельных оболочек Unix, наряду с Bourne shell (sh).
История
C shell была создана Биллом Джоем, одним из ключевых разработчиков операционной системы BSD Unix, во время его учёбы в Калифорнийском университете в Беркли. Первая версия была выпущена в 1978 году как часть 2BSD (Second Berkeley Software Distribution). Основной мотивацией для создания csh стало желание предоставить пользователям более удобный и мощный интерфейс командной строки по сравнению с существовавшей тогда оболочкой Bourne shell (sh), которая имела ограниченные возможности для интерактивной работы.
Джой заимствовал многие идеи из более ранней оболочки TENEX (TOPS-20), которая использовалась на мейнфреймах DEC PDP-10. Оттуда пришли такие функции, как история команд, редактирование строки и псевдонимы. Название «C shell» отражает синтаксис, который во многом напоминает язык программирования C (например, использование фигурных скобок для блоков и операторов управления, таких как if, while, switch).
В 1980-х годах csh стала стандартной оболочкой в системах BSD и получила широкое распространение в академической среде и среди разработчиков. Однако в конце 1980-х — начале 1990-х годов её популярность начала снижаться из-за появления более совершенных оболочек, в первую очередь tcsh (расширенная версия csh с улучшенным редактированием командной строки) и bash (Bourne Again SHell), которая сочетала синтаксис sh с функциями csh и tcsh. Несмотря на это, csh остаётся используемой в некоторых системах и для написания скриптов, хотя её применение в этой области считается устаревшим и не рекомендуется из-за ряда архитектурных недостатков.
Основные характеристики
Интерактивная работа
C shell была спроектирована в первую очередь как интерактивная оболочка. Её ключевые возможности для удобства пользователя включают:
- История команд: Позволяет просматривать, повторять и редактировать ранее введённые команды. Команды нумеруются, и к ним можно обращаться по номеру (например,
!123) или по частичному совпадению (например,!ls). - Псевдонимы (алиасы): Позволяют создавать сокращённые или заменяющие имена для длинных команд. Например,
alias ll 'ls -la'создаёт командуll, которая выполняетls -la. - Редактирование командной строки: В оригинальной csh было ограниченным, но в её наследнике tcsh получило полноценную поддержку (перемещение курсора, удаление, вставка).
- Управление заданиями: Позволяет запускать команды в фоновом режиме (с помощью символа
&), приостанавливать их (Ctrl+Z), переводить на передний план (fg) или обратно в фон (bg). - Автодополнение: В tcsh и некоторых версиях csh поддерживается дополнение имён файлов и команд по нажатию клавиши Tab.
Синтаксис, подобный C
Синтаксис csh для написания скриптов и управления потоком выполнения заимствован из языка C:
- Блоки кода заключаются в фигурные скобки
{ ... }. - Условные операторы:
if (выражение) командаилиif (выражение) then ... endif. - Циклы:
foreach переменная (список) ... endиwhile (выражение) ... end. - Оператор выбора:
switch (переменная) case значение: ... breaksw endsw.
Переменные
C shell использует два типа переменных:
- Переменные оболочки: Управляют поведением самой оболочки (например,
path,home,history). Устанавливаются командойset. - Переменные окружения: Передаются дочерним процессам. Устанавливаются командой
setenv.
Пример: `` set myvar = "Hello" # переменная оболочки setenv PATH /usr/bin:/bin # переменная окружения ``
Подстановка команд
C shell поддерживает подстановку команд с помощью обратных кавычек (` `). Например: ` set files = ls ` Эта команда присваивает переменной files результат выполнения команды ls`.
Критика и недостатки
Несмотря на свою популярность в прошлом, C shell подвергается критике, особенно в контексте написания скриптов. Основные недостатки:
- Несовместимость с POSIX: C shell не соответствует стандарту POSIX для командных оболочек, что делает скрипты на csh непереносимыми между различными Unix-системами.
- Проблемы с обработкой ошибок: В csh отсутствует надёжный механизм обработки ошибок. Например, команда
exitв скрипте может не сработать, если она вызвана внутри цикла или условного блока. - Сложность синтаксиса: Некоторые конструкции, такие как подстановка команд и работа с массивами, реализованы неинтуитивно и подвержены ошибкам.
- Отсутствие функций: В оригинальной csh нет поддержки пользовательских функций, что затрудняет модульное программирование.
- Проблемы с производительностью: Интерпретатор csh может работать медленнее, чем bash или sh, особенно при выполнении сложных скриптов.
Из-за этих недостатков многие руководства по Unix и Linux (например, Linux Standard Base) настоятельно рекомендуют использовать для написания скриптов оболочки, совместимые с POSIX (sh, bash, ksh), а не csh.
Разновидности и наследники
tcsh (Tenex C shell)
tcsh — это расширенная версия C shell, созданная в 1981 году Кеном Гриром (Ken Greer) в Университете Карнеги-Меллон. Она добавила полноценное редактирование командной строки, автодополнение по Tab, улучшенную историю команд и множество других удобств. tcsh полностью обратно совместима с csh и на многих системах (например, FreeBSD) является синонимом csh. tcsh остаётся популярной среди пользователей, ценящих интерактивные возможности.
Другие оболочки, испытавшие влияние csh
- bash: Заимствовал у csh историю команд, псевдонимы и управление заданиями, но использует синтаксис sh для скриптов.
- zsh: Также включает многие интерактивные возможности, впервые реализованные в csh.
Применение
В настоящее время C shell (как csh, так и tcsh) используется в следующих случаях:
- Интерактивная работа: Некоторые опытные пользователи Unix и BSD предпочитают tcsh за его удобство в повседневной работе.
- Системное администрирование: В некоторых старых системах или в средах, где csh является оболочкой по умолчанию (например, в некоторых версиях FreeBSD).
- Написание простых скриптов: Хотя это не рекомендуется, csh иногда используется для быстрых однострочных скриптов или в учебных целях.
- Наследие: Множество старых скриптов и конфигурационных файлов (например,
.cshrc) всё ещё существуют в корпоративных и академических средах.
Интересные факты
- Название «C shell» иногда ошибочно расшифровывают как «C Shell», но на самом деле это просто «си-шелл», отражающее синтаксис.
- Билл Джой, создатель csh, также известен как сооснователь компании Sun Microsystems и один из разработчиков языка Java.
- В некоторых операционных системах (например, в macOS до версии 10.15 Catalina) csh/tcsh использовалась как оболочка для пользователя root по умолчанию.
- Команда
rehashв csh используется для перестроения хеша команд после изменения переменнойpath, что ускоряет поиск исполняемых файлов.
Источники
- Bill Joy. «An Introduction to the C shell». University of California, Berkeley, 1978.
- Ken Greer. «tcsh: An extended C shell». Carnegie Mellon University, 1981.
- «UNIX Shells: A Brief History». Linux Journal, 2003.
- «C shell — Wikipedia, the free encyclopedia».
- «tcsh — Wikipedia, the free encyclopedia».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →