Tcsh: зачем он нужен?

Для пользователя любого универсального дистрибутива Linux'а вопрос, вынесенный в заголовок, представляется более чем резонным. Ведь в его распоряжении по умолчанию имеется командная оболочка bash, причём, скорее всего уже настроенная "из коробки" -- если и не идеальным для него образом, то вполне разумно и легко корректируемо, как показано на предыдущих страницах.

Иное дело во FreeBSD. Здесь в качестве командной оболочки для обычного пользователя (login shell) по умолчанию выступает так называемая /bin/sh -- разновидность оболочки Альмквиста (ash), входящая в базовый комплект (base) FreeBSD Distributions и подлежащая установке при любом типе инсталляции этой ОС. Оболочка /bin/sh полностью соответствует стандарту POSIX для командных оболочек, описанному в соответствующем документе: Shell & Utilities. Это делает её незаменимым инструментом для составления общесистемных и пользовательских скриптов, поскольку точное соответствие стандарту гарантирует их работоспособность в любой POSIX-совместимой операционке. Обзор базовых возможностей /bin/sh можно видеть здесь.

Однако следование стандарту, аки воинскому уставу, имеет оборотную сторону: в /bin/sh не содержится ничего, выходящего за рамки стандарта. В частности, он лишён большинства даже тех элементарных функций интерактивной работы, которые пользователями Linux, благодаря оболочке bash, впитываются с первых шагов в этой системе, без всяких настроек своего умолчального шелла.

Конечно, и для пользователей FreeBSD дело обстоит не так печально, как кажется на первый взгляд: в этой системе в качестве портов и пакетов доступны практически все командные оболочки, созданные человечеством, в том числе, и bash вместе с bash-completion, и zsh. Однако их надо еще тем или иным способом установить и, главное, настроить: без должным образом составленных пользовательских конфигов ни bash, ни, особенно, zsh не покажут своих интерактивных возможностей во всём блеске.

Да и стоит ли умножать сущности установкой дополнительных пакетов или портов, когда под рукой пользователя FreeBSD, в базовом комплекте FreeBSD Distributions уже имеется развитая командная оболочка tcsh, с точки зрения интерактивных возможностей превосходящая bash... ну хорошо, специально для bash-фанов сформулирую мягче: превосходит чистый bash, который способен достигнуть функциональности tcsh только вместе с bash-completion.

Конечно, оболочка tcsh не поддерживает многих изощренных интерактивных функций zsh, однако все ли они нужны каждодневно? А большинство функций zsh из числа тех, которые необходимы регулярно, в tcsh имеются.

Что же до простоты настройки -- тут уж tcsh оставляет далеко позади обе конкурирующие оболочки: для его конфигурирования требуется правка всего двух очень прозрачно устроенных конфигурационных файлов. Пользователь же bash должен всё время помнить о том, какие параметры обеспечиваются собственно профильными файлами этой оболочки (bash_profile и bashrc), а к каким он получает доступ благодаря библиотеке readline с её собственным конфигом (inputrc), какие функции доступны ему при базовой установке, а какие содержатся только в bash-completion. Что же касается zsh, то конфигурирование его для достижения полной функциональности вообще представляет собой очень не тривиальную задачу, требующую чтения многостраничной документации.

Правда, об одном коренном и неустранимом "недостатке" tcsh я должен предупредить сразу: даже виртуозное владение всем предоставляемым им функционалом не освобождает от необходимости хотя бы базовых представлений о синтаксисе POSIX Shell-совместимых интерпретаторов, к классу коих принадлежит поминаемый ранее /bin/sh: все общесистемные сценарии во FreeBSD написаны именно на нём, а язык интерпретатора tcsh с ними несовместим.

Впрочем, пользователи bash и zsh, относимых к классу sh-совместимых интерпретаторов, тоже должны помнить об отличиях языков сценариев для своих оболочек от чистого shell-скриптинга: не случайно в фундаментальной книге по программированию на Shell автор её, Дэвид Тейнсли, постоянно оговаривает все случаи использования "bash'измов".

Что же до языка C-Shell, используемого в интерпретаторе tcsh, то его несовместимость с чистым POSIX Shell компенсируется простотой и лаконичностью, что делает его более чем пригодным для сочинения пользовательских сценариев индивидуального применения.

Все эти положения я и постараюсь осветить в настоящем очерке. А уж дальше пользователь сам решит, потребуется ли ему установка дополнительных портов или пакетов, или функциональности tcsh хватит за глаза.


Содержание

. .