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
, рассмотрим некоторые её особенности более подробно. Начнём со встроенных команд.
Содержание . .