Tcsh: специфика

Никакими из перечисленных выше функций не удивить пользователя bash и, тем более, zsh, однако в tcsh они реализованы существенно иначе. Собственно, основные особенности tcsh проще всего рассмотреть в их сравнении с таковыми оболочек sh-совместимого типа.

Так, одно из первых различий, которое бросается в глаза пользователю, -- обращение с путями к исполняемым файлам. Клоны шелла Борна при вводе команды перечитывают состав каталогов, включенных в качестве значений переменной PATH. В семействе же csh эти значения, считываясь один раз при старте, далее хранятся в чем-то типа собственного буфера, именуемого хэш-таблицей. В результате этого достигается выигрыш в быстродействии исполнения внешних команд.

Оборотная сторона выигрыша в скорости вызова внешних команд также налицо: при добавлении к одному из каталогов переменной PATH нового файла (типичный случай -- при установке нового пакета) оболочка tcsh его просто не увидит. То есть для вызова такой новой программы пришлось бы либо выходить из данного сеанса и авторизоваться заново, либо, в текущем сеансе, -- указывать полный путь к ее исполнимому файлу. Благо, есть иная возможность -- перед запуском исполняемого файла вновь установленного пакета модифицировать хэш-таблицу, для чего предназначена специальная встроенная команда rehash.

Далее, важное с точки зрения пользователя различие -- в ином способе определения переменных. Если во всех POSIX-шеллах для этого достаточно задать имя и значение, то здесь этой цели служит специальная встроенная команда set, аргументом которой будет имя задаваемой переменной. Например, установка переменной

% set nobeep

приведёт к отмене звукового сигнала, подача которого включена по умолчанию.

Переменные могут иметь некоторые предопределённые значения. В этом случае они присваиваются через знак равенства. Так, установка переменной

% set correct = cmd

включит коррекцию ошибок при наборе команд, а значение all распространит коррекцию и на пути в их аргументах.

Средств для экпорта переменных оболочки в среду tcsh не предусматривает. Вместо этого для задания переменных среды существует специальная встроенная команда setenv. Так, конструкция

% setenv PAGER less

установит в качестве "листателя страниц" (вызываемого, например, при обращении к man-документации) less (вместо умолчального more). Обратим внимание на различие синтаксиса команд set и setenv: во втором случае присвоение значения переменной знака равенства не требует.

В отличие от sh-совместимых оболочек, в tcsh имена в нижнем регистре имеют встроенные переменные оболочки, такие, как shell, user, history, а имена переменных, определяемых пользователем, подобно PAGER, EDITOR, BLOCKSIZE, принято задавать в регистре верхнем.

Каждая из названных только что команд, и set, и setenv, данная без аргументов, выведет список всех определенных переменных оболочки и окружения соответственно. А для вывода значений абсолютно всех определённых переменных есть специальная встроенная команда -- printenv.

"Разопределение" переменных оболочки выполняется с помощью команды unset, переменных среды -- unsetenv, обе из которых в качестве аргумента требуют указания имени отменяемой переменной. Вопреки ожиданиям, unset и unsetenv, заданные без аргументов, вызовут не отмену всех определённых с их помощью переменных, а сообщение об ошибке:

% unset
unset: Too few arguments.

Мелкие различия между семействами sh и csh существуют также в назначении псевдонимов. И там, и там для этого служит встроенная команда alias. Но если в первом случае она требует оператора присваивания и экранирования значения псевдонима строгими кавычками, то в tcsh достаточно такой формы:

% alias less less -M

Она придаст команде less так называемый "more-подобный" вид (с указанием в статусной области полного пути к просматриваемому файлу, диапазона выведенных на экран строк и общего количества строк в файле).

Впрочем, резонные люди всё равно и в tcsh рекомендуют экранировать значение псевдонима строгими кавычками.

Команда alias без указания аргументов выведет полный список задействованных псевдонимов. А их "развоплощение" осуществляется командой unalias с именем (но не значением) псевдонима в качестве аргумента. Как и в случае с unset и unsetenv, команда unalias без аргумента не даст никакого результата, кроме сообщения об ошибке.

Некоторая специфика tcsh проявляется и в перенаправлении ввода-вывода. Так, в этой оболочке не предусмотрено обращение к стандартным дескрипторам (ввода, вывода и диагностических сообщений) по их традиционным номерам (0, 1, и 2 соответственно). И потому конструкция типа 2> /dev/null, подавляющая вывод на экран нежелательных сообщений об ошибках (особенно часто это требуется при использовании утилит find и grep), оказывается невозможной. Зато конструкция >& отправит в небытие и стандартный вывод, и стандартную диагностику скопом.

Решение задачи подавления вывода нежелательных сообщений об ошибках возможно в виде такой конструкции:

% (command > out)>& err

где command -- команда со всеми её опциями и аргументами, out -- условное имя файла, в который перенаправляется "полезный" вывод команды, а & в данном контексте представляет весь остаток от оного, то есть сообщения об ошибках, которые помещаются в файл err. Имя последнего также условно, так что никто не запрещает подменить его сакраментальным /dev/null.

Конструкция далеко не столь проста и изящна, как в sh-совместимых оболочках типа bash и, тем более, zsh (где команде с операцией перенаправления можно вообще определить глобальный псевдоним). Кроме того, для просмотра "полезного" вывода она потребует ещё одной команды -- вызова какого-либо пейджера вроде less:

% (command > out)>& err ; less out

Но эта конструкция имеет одно неоспоримое достоинство -- она работает.

Наконец, между семействами sh и csh существует различие в их обращении с условными выражениями. В классических POSIX-шеллах это -- просто цепочки команд (подобные конвейерам), в которых выполнение каждой последующей команды определяется успешным или неуспешным завершением предыдущей. В csh же они представляют собой вычисляемые арифметические или логические выражения.

А теперь, установив в первом приближении специфику оболочки tcsh, рассмотрим некоторые её особенности более подробно. Начнём со встроенных команд.


Содержание

. .