Предыстория tcsh: C-shell

Как уже говорилось в первых строках этого очерка, командная оболочка, используемая в аккаунте администратора FreeBSD по умолчанию, именуется csh, в чём легко убедиться такой командой:

# echo $SHELL

которая даст вывод

/bin/csh

В каталоге же /bin можно обнаружить два исполняемых файла:

% ls /bin/*csh                                                          11:22
/bin/csh*	/bin/tcsh*

Пояснение: в данном цикле, в отличие от остальных, в соответствии с умолчаниями оболочек семейства C-shell, для обозначения приглашения командной строки оболочки суперпользователя используется символ #, обычного пользователя -- символ %.

Означает ли наличие двух разноименных файлов в каталоге /bin, что csh и tcsh суть разные оболочки? Отнюдь: команда

# ls -li /bin/*csh
2610 -r-xr-xr-x  2 root  wheel  354616  7 сен 15:34 /bin/csh*
2610 -r-xr-xr-x  2 root  wheel  354616  7 сен 15:34 /bin/tcsh*

показывает нам, что они имеют не только одинаковый размер (346 Кбайт), но и совпадающие идентификаторы (2610). То есть оба имени, и csh, и tcsh -- это не более чем жесткие ссылки (hardlinks) на один и тот же бинарник (в скобках замечу, что жесткие ссылки не надо путать ни с копией файла, ни с псевдонимом команды, ни с символической ссылкой: это просто две записи в каталоге, относящиеся к одному и тому же inode с его набором данных).

Почему так получилось? Чтобы ответить на этот вопрос, придётся обратиться к истории.

Как известно, первой командной оболочкой для первозданного UNIX'а была программа, именовавшаяся сначала просто shell, написанная в 1978 году Стефаном Борном, вследствие чего за ней позднее закрепилось имя "шелл Борна" (Bourne shell). Язык её интерпретатора был основан на Algol 68, что определило мощные по тем временам возможности составления сценариев: достаточно сказать, что многие команды, позднее вошедшие в золотой фонд классических Unix-утилит (породивших, в свою очередь, BSD- и GNU-утилиты), первоначально были реализованы именно как shell-скрипты. Примеры этому можно найти в книге Рассела Сейджа Приёмы профессиональной работы в UNIX, изданной более четверти века назад, но не потерявшей своего методического значения и по сей день.

Однако, средства интерактивной работы в первозданном шелле Борна были, мягко говоря, не очень хорошо развиты: если обратиться к известной сравнительной таблице оболочек для Unix Брайана Блэкмора, то во всех её строках, имеющих какое-либо отношение к интерактивности, можно видеть жирное N. То есть в ней не было ничего из того, к чему мы привыкли с младых ногтей: ни автодополнения, ни истории команд, ни возможности редактирования командной строки, ни даже возможности изменить вид приглашения.

Да, мы знаем, что потом всё это постепенно и по очереди будет появляться -- сначала в шелле Корна (ksh), и в шелле Альмквиста (ash), и в bash (возрождённом шелле Борна), и, наконец, в zsh, ставящем на сегодняшний день последнюю точку в развитии командных оболочек. Но сейчас-то мы находимся в далёких 70-х годах прошлого века, когда UNIX только вышел из родительских пенат AT&T и отправился в (почти) свободное плавание по университетам Америки, Европы и сопредельных стран вроде Австралии. Пришвартовавшись, в частности, и в университете Беркли, штат Калифорния.

В Университете Беркли в это время вовсю разрабатывался собственный вариант UNIX, который позднее получит имя BSD4.4 и ляжет в основу FreeBSD (а также всех остальных свободных операционок берклианского семейства см. исторический очерк). И один из перворазработчиков BSD, Билл Джой, которому мы обязаны также текстовым редактором vi, уже в 1979 году предложил свою командную оболочку, получившую имя C-shell (или просто csh).

Почему? Если Борн при создании shell'п опирался на язык Алгол, то Джой для языка своего шелла применил синтаксис, сходный с таковым языка Си, исконного для UNIX. Это сделало оболочки sh и csh несовместимыми на уровне сценариев. Но зато в csh было добавлено множество интерактивных возможностей -- автодополнение, буфер истории, средства навигации внутри командной строки и её редактирования, настройка вида приглашения, различие схемы настройки интерактивного и неинтерактивного шелла... Короче, всё то, что потом в той или иной мере инкорпорировали shell-совместимые оболочки, включая bash и zsh. И что ныне кажется нам неотъемлемым атрибутом любого шелла -- всё это в конечном итоге происходит из csh.

Так что C-shell очень быстро стал непременной принадлежностью разрабатываемой в Брекли BSD-системы -- в отличие от коммерческих UNIX'ов, стандартные оболочки которых, вроде ksh, развивали традиции шелла Борна (хотя и, как только что говорилось, с опорой на достижения csh).

Впрочем, интерактивные возможности csh были далеки от идеала. Что особенно почувствовалось в начале 90-х годов, когда, с одной стороны, произошло освобождение BSD-систем в лице NetBSD и FreeBSD от тяжёлого наследия проприетарного режима лицензирования. А с другой -- началось победное шествие Linux'а с его стандартной оболочкой GNU bash, обходящей древний csh на несколько корпусов.

И тогда разработчики FreeBSD вспомнили об оболочке tcsh, которая, основываясь на синтаксисе C-shell, с давних времён разрабатывалась сначала Кэном Григом в университете Карнеги-Меллона, а затем Полом Плэйсвэем в университете Огайо. Чем она была примечательна? Сейчас увидим.


Содержание

. .