Интерпретатор команд ведет список псевдонимов, которые
могут устанавливаться, отображаться и модифицироваться с
помощью команд alias и unalias. Командная строка после
просмотра разбивается на отдельные слова, каждое слово,
интерпретируемое как имя команды, проверяется, чтобы выяс-
нить, имеет ли оно псевдоним. Если да, это слово заменяется
на значение псевдонима. Всюду в командных строках при соз-
дании псевдонимов символ ! необходимо экранировать. В про-
тивном случае он будет интерпретироваться как обращение к
протоколу. Псевдонимы можно устанавливать и на команды csh,
например

alias a alias

устанавливает псевдоним на команду alias.

1.12. Переменные интерпретатора csh

Интерпретатор csh оперирует переменными двух видов:
внутренними и внешними. Внутренние переменные устанавливают
режим работы интерпретатора, а внешние в основном относятся
к командным строкам, которые им интерпретируются. Обращение
к переменным может быть простым (установлена переменная или
нет) и сложным. Например, переменная argv представляет
образ списка параметров командной строки, а переменная ver-
bose является ключом и существенно лишь ее наличие или
отсутствие. Особое место занимают так называемые переменные
окружения. Интерпретатор считывает их значения при запуске.
Значения переменных окружения становятся внутренними конс-
тантами интерпретатора и их можно использовать как константы


- 49 -










в командных строках и командных файлах. Каждая внутренняя
переменная имеет определенный смысл для интерпретатора.
Часть внутренних переменных всегда устанавливается интерпре-
татором при инициализации либо при запуске-завершении про-
цессов. После чего переменные не будут модифицироваться,
если этого не сделает пользователь. К числу внутренних
переменных относятся: argv, cdpath, cwd, home, path, prompt,
shell. Переменные child и status устанавливаются при
порождении процессов и сохраняют свое значение до появления
новых. Значения переменных устанавливаются командой set или
ключом при вызове csh. Исключить переменную из числа опреде-
ленных можно командой unset. Ниже приводится список внут-
ренних переменных и их назначение.

argv
представляет строку параметров. К ней применимы подста-
новки позиционных параметров.

cdpath
этой переменной присваивается список имен каталогов, к
которым пользователь часто будет обращаться. Допустим,
cdpath определена следующим образом: set cdpath = (
/usr/include /usr/lib ), тогда команда chdir sys тож-
дественна команде chdir /usr/include/sys.

checktime
если эта переменная установлена и если в течение ука-
занного времени не выполнялось каких-либо действий, то
выполняется exit. Допустим, выполнена команда set
checktime = 3, тогда, если в течение 3 мин не выполня-
лись какие-либо действия, выполняется exit, и интерпре-
татор прекращает работу.

child
номер процесса. Выводится на экран дисплея при запуске
параллельного процесса. Значение переменной child сбра-
сывается, когда этот процесс завершается.

cwd
значением этой переменной является строка - полное имя
рабочего каталога. Это имя может не совпадать с истин-
ным, если установлен symlink.

echo
вызывает печать каждой команды перед выполнением. Все
подстановки выполняются перед выводом. Режим echo
можно установить либо на все время работы, либо на
период выполнения одного командного файла. Например,
csh -x comfile установит режим echo на время выполнения
командного файла comfile, а команда set echo - на все
время работы интерпретатора.




- 50 -










history
численное значение этой переменной устанавливает коли-
чество строк, которое необходимо хранить в протоколе.
Для слишком большого числа строк может не хватить
памяти. Оптимальное число - 22 строки.

home
регистрационный каталог пользователя. Его имя считыва-
ется при запуске csh из переменной окружения HOME.

ignoreeof
предотвращает случайное завершение работы интерпрета-
тора по признаку конец файла. Этот признак выглядит как
СУ/D или CTRL/D при вводе с клавиатуры дисплея. Признак
конца файла можно заменить на другой командой системы
stty(1).

mail
имя файла, в который будет поступать почта.

noclobber
устанавливает защиту файлов от случайного разрушения.

noglob
запретить расширение имен файлов.

nonomatch
обычно, если указанному шаблону (например, echo *.[2-
5]) не соответствует ни один образец, порождается сос-
тояние ошибки. Если установлена переменная nonomatch,
состояние ошибки не возникает, а указанный шаблон возв-
ращается программе.

notify
асинхронно выводить сообщения о состояниях выполняемых
процессов. Если переменная notify не установлена, эти
сообщения выводятся перед выводом нового приглашения.

path
определяет имена каталогов, в которых интерпретатор
будет искать файлы команд, запускаемых на выполнение.
При запуске интерпретатора создается хеш-таблица команд
из каталогов, указанных в path. Хеширование существенно
сокращает время поиска команды при ее запуске. Если
после входа в систему, т.е. после хеширования катало-
гов, будет записана в один из них новая команда, то она
будет отсутствовать в хеш-таблицах, и интерпретатор не
будет ее обнаруживать. Для разрешения этой ситуации
необходимо выполнить команду rehash. По команде rehash
будут перестроены хеш-таблицы, и новые команды будут
доступны. При запуске нового интерпретатора снова
читается файл ~/.cshrc и строится хеш-таблица. На эту
операцию уходит достаточно много времени и, если есть


- 51 -










необходимость более быстрого старта, при запуске необ-
ходимо использовать ключ -f

csh -f comfile

Перестройка хеш-таблиц осуществляется также всякий раз,
когда с помощью команды set изменяется значение пере-
менной path.

prompt
содержит строку символов, которая выводится в качестве
приглашения. Если эта строка символов включает воскли-
цательный знак, на его место подставляется текущий
номер командной строки. Если переменная prompt не уста-
новлена, печатается приглашение % для рядового пользо-
вателя и # для суперпользователя.

shell
содержит имя интерпретатора, который запускается при
входе пользователя в систему. Имя интерпретатора ука-
зано в переменной среды SHELL и считывается в начале
сеанса.

status
принимает значение кода завершения команды, например:

% false ; echo $status
1
% true ; echo $status
0

Здесь команда false возвращает 1 - код неудачного
завершения, команда true возвращает 0 - код удачного
завершения.

time
хронометрирует выполнение командных строк. Если выпол-
нение продолжалось дольше указанного времени, выводятся
результаты хронометрирования. Например, в файле
~/.cshrc выполнено назначение set time = 6, это значит,
что интерпретатор будет выводить результаты хронометри-
рования, когда время выполнения командной строки превы-
сит 6 с. Если теперь выполнить команду, например, sort
file, то после ее завершения будет выведен результат
хронометрирования:

1.6u 17.9s 0:26 74%

Здесь: 1.6u - время пользовательской фазы процесса;
17.9s - время системной фазы процесса; 0:26 - астроно-
мическое время процесса; 74% - отношение в процентах
суммы пользовательской и системной фаз процесса к аст-
рономическому времени.


- 52 -










verbose
устанавливает режим распечатки слов каждой команды с
учетом подстановок. Этот режим можно установить,
используя ключ -v при запуске интерпретатора на выпол-
нение.


При запуске командных файлов можно устанавливать раз-
личные ключи. При этом командная строка выглядит следующим
образом:

csh -список_ключей имя_файла ...

Если имя_файла не указано, то порождается новая интерактив-
ная оболочка.

Ниже перечислены ключи интерпретатора и их значения:

-c считать команду из единственного параметра, указанного
сразу после -c;

-e интерпретатор прекращает работу, если любая вызванная
команда завершается ненормально (код возврата не 0);

-f запретить чтение файла ~/.cshrc для более быстрого
старта;

-i запустить новую оболочку как интерактивную. Если вызов
интерпретатора осуществляется с клавиатуры дисплея,
этот ключ устанавливается по умолчанию;

-n осуществлять разбор командных строк, но не выполнять
команды. Это режим отладки;

-s читать из стандартного ввода;

-t считывать и выполнять только одну строку. Эта строка
может содержать в конце символ продолжения строки \;

-v после подстановок из протокола распечатать команду
перед ее выполнением;

-V перед разбором строк из файлов ~/.cshrc и ~/.login
установить ключ -v. Это позволит увидеть на экране
дисплея, как интерпретатор устанавливает назначения и
выполняет командные строки при интерпретации этих фай-
лов;

-x печатать на экране дисплея все команды перед выполне-
нием;

-X установить ключ -x при интерпретации файлов ~/.cshrc и
~./login.


- 53 -










Внешние переменные - это такие переменные, которые
устанавливаются и используются только пользователем. В
отличие от внутренних переменных и переменных окружения
внешние переменные имеют тот смысл, который придается им
пользователем. Значения внешних переменных могут быть уста-
новлены и отображены командой set и отменены командой unset.

Система поддерживает массив переменных, который назы-
вают переменными среды или окружения. Переменные окружения
используются системными и пользовательскими программами.
Для установки значений переменных окружения используется
команда setenv, для отмены - команда unsetenv. Имеется нес-
колько стандартных имен переменных окружения, их значения
зависят от соответствующих назначений командой setenv. Часть
этих назначений происходит при открытии сеанса работы.
Пользователь имеет возможность переустановить значения
существующим переменным, объявить и присвоить значения
новым. Значения стандартных переменных окружения использу-
ются многими системными программами. Они доступны как конс-
танты и программам пользователя. Важно отметить, что значе-
ния переменных окружения являются внутренними константами
интерпретатора. Перечисленные ниже имена зарезервированы
как стандартные имена переменных окружения:

PATH
имена стандартных каталогов, разделенных двоеточием;

HOME
регистрационный каталог пользователя, установленный в
файле /etc/passwd;

TERM
имя типа терминала;

TERMCAP
строка определения возможностей дисплея из файла
/etc/termcap;

SHELL
имя интерпретатора командного языка, который инициали-
зируется при входе пользователя в систему;

MSG
определяет, на каком языке будут выводиться сообщения
пользователю при работе с системой (MSG = r - на русс-
ком, MSG = l - на английском);

USER
регистрационное имя пользователя.


Команда unsetenv удаляет добавленные во время работы
переменные окружения. Команда setenv позволяет объявить и


- 54 -










присвоить значение новой переменной окружения

% setenv NAME 15
% echo $NAME
15
% @ a = ( $NAME + 15 )
% echo $a
30
% setenv NAME "Jan Feb Mar Apr"
% echo $NAME
Jan Feb Mar Apr


Переменные окружения отличаются от переменных интерпре-
татора тем, что они не влияют на работу интерпретатора.

1.13. Специальные файлы

В регистрационном каталоге пользователя размещается
несколько специальных файлов: ~/.hushlogin, ~/.login,
~/.cshrc, ~/.logout и ~/.history.

Файл ~/.hushlogin пустой и используется как ключ. Если
он существует, при открытии сеанса работы не выводится на
экран дисплея /etc/motd - файл с текстом сообщения админист-
ратора. Обычно в файле /etc/motd содержаться сведения о
версии системы, "вывеска" организации и т.д.

При открытии сеанса работы интерпретатор читает файлы
~/.login и ~/.cshrc, а при завершении работы - файл
~/.logout. При входе пользователя в систему первым читается
файл ~/.cshrc, потом ~/.login. Если в регистрационном ката-
логе имеется файл ~/.history, то он считывается в протокол.
Все перечисленные файлы, кроме ~/.history, являются обычными
командными файлами, в которых программист определяет жела-
тельные для себя действия по входу и выходу из системы.

Файл ~/.login определяет те действия, которые необхо-
димо выполнить в начале сеанса работы пользователя. Ниже
приведен пример такого файла:

set ignoreeof
set prompt = 'Иванов И.И._\!> '
if( $?MAIL ) set mail = $MAIL
msgs
setenv MSG r


В первой строке устанавливается ключ ignoreeof, который
предотвращает случайное завершение работы интерпретатора при
наборе на клавиатуре дисплея символа СУ/D (CTRL/D).




- 55 -










Во второй строке устанавливается приглашение, которое
будет выдаваться при готовности принять новую командную
строку. Здесь вместо \! будут подставляться текущие номера
строк history, например :

Иванов И.И._15>


В третьей строке указывается имя почтового файла. Если
он будет не пуст, то на экране дисплея появится сообщение:
"У Вас есть новая почта ". Эти определения существенно
зависят от версии программы mail, установленной в системе.

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

В пятой строке определяется переменная MSG, которая
определяет язык диагностик (в данном случае - русский, для
английского указывется буква l).

При завершении сеанса работы читается файл ~/.logout и
выполняются указанные в нем действия. Список таких действий
зависит исключительно от фантазии программиста. В файле
~/.logout можно разместить все команды, которые необходимо
выполнить по выходу из системы. Важно отметить, что, нес-
мотря на выход пользователя из системы, все процессы, запу-
щенные им как асинхронные, будут продолжать выполняться.

При каждом вызове csh выполняет файл ~/.cshrc. Ниже
приведен пример файла ~/.cshrc:

set path = ( . /bin /usr/bin /usr/ucb )
set history = 22
set savehist = 22
set checktime = 3
set prompt = 'ИВАНОВ И.И._\!> '
alias h history
alias c /bin/cat
alias l /bin/ls -l


set path = (. /bin /usr/bin /usr/ucb)
устанавливает те каталоги, где csh будет искать команды
перед запуском их на выполнение.

set history = 22
устанавливает количество последних командных строк,
которые должны сохраняться в протоколе.

set savehist = 22
устанавливает количество строк протокола, которое


- 56 -










необходимо запомнить в файле ~/.history. При входе в
систему этот файл будет прочитан и записан в протокол.

set checktime = 3
устанавливает время (3 мин), в течение которого csh
может "бездействовать". Если в течение указанного вре-
мени не будут выполняться какие-либо действия, то
выполняется команда exit и csh прекращает работу.
Такое завершение работы полезно, когда пользователю
необходимо отлучиться.

set prompt = 'ИВАНОВ И.И._\!>'
устанавливает приглашение, которое будет выводить csh
при порождении нового экземпляра интерпретатора. Сим-
волы этого приглашения специально набраны заглавными
буквами, чтобы у пользователя была возможность отличить
основной экземпляр интерпретатора от порожденного
нового.


Остальные команды демонстрируют возможность использова-
ния псевдонимов команд. Заметим, что файл ~/.login выполня-
ется только один раз - в начале сеанса работы в системе;
файл ~/.cshrc выполняется при запуске каждой новой оболочки.

1.14. Встроенные команды и операторы

Ниже перечислены имена встроенных команд, их синтаксис
и действие.

alias
alias имя
alias имя список_слов


команда alias позволяет устанавливать псевдонимы команд
и командных строк. При обращении к командам или команд-
ным строкам, для которых выполнена команда alias, можно
использовать их псевдонимы. Первая форма распечатывает
все псевдонимы, вторая - псевдоним для указанного
имени, если он установлен, третья устанавливает псевдо-
ним для заданного списка слов. В списке слов выполня-
ются подстановки.

alloc
показывает размер используемой динамической памяти,
включая используемую и свободную память, а также адрес
последней ячейки памяти. Используется для отладки
интерпретатора.

bg
bg %внутренний_идентификатор_процесса
bg %шаблон_имени_процесса


- 57 -










переводит последний приостановленный или указанный про-
цесс в асинхронный режим выполнения.

break
вызывает выход за end ближайшей внешней конструкции
foreach или while. Можно выполнять переходы через нес-
колько уровней посредством написания нескольких опера-
торов break в одной строке, разделяя их символом ;.

breaksw
вызывает выход из оператора switch за пределы оператора
endsw;

case метка:
метка - шаблон одного из вариантов оператора switch.
В метках можно использовать шаблоны имен файлов и ката-
логов ( *, ?, [...] ). Двоеточие обязательно.

cd
cd имя
chdir
chdir имя


заменяет рабочий каталог на каталог имя. Если параметр
отсутствует, осуществляется переход к регистрационному
каталогу пользователя.

continue
продолжает выполнение ближайшего внешнего while или
foreach. Все строки цикла до end пропускаются, и начи-
нается новая итерация цикла.

default:
используется в switch. Если после всех проверок не
нашлось варианта, совпавшего с вариантом в case, выпол-
няется то, что указано в варианте default. Вариант
default должен располагаться после всех case. Двоето-
чие обязательно.

dirs
напечатать содержимое стека имен каталогов. Занесение
имен каталогов в стек выполняет команда pushd, удаление
имен каталогов из стека выполняется командой popd.
Элементы стека нумеруются от 1, начиная от вершины
стека.

echo список_слов
echo -n список_слов


список слов записывается в стандартный вывод. Ключ -n
запрещает переход на новую строку после вывода.


- 58 -










else
end
endif
endsw


см. ниже описание операторов foreach, if, switch и
while.

eval арг ...
сначала производятся все подстановки, затем слово eval
отбрасывается, и оставшиеся символы рассматриваются как
командная строка, которая выполняется.

exec команда
команда запускается вместо интерпретатора. Работа
интерпретатора завершается.

exit
exit(выражение)


происходит выход из интерпретатора (первая форма) либо
со значением указанного выражения (вторая форма). Зна-
чение переменной status всегда равно коду возврата.

fg
fg %внутренний_идентификатор_процесса
fg %шаблон_имени_процесса


возвращает последний приостановленный (первая форма)
или указанный процесс в синхронный режим выполнения.

foreach имя (список_слов)
...
end


переменной имя последовательно присваиваются значения
каждого члена списка слов и выполняется последователь-
ность команд между данной командой и соответствующим
оператором end (foreach и end должны находиться в
отдельных строках).

glob список_слов
аналогична команде echo. Слова выводятся без пробела и
после последнего слова не выполняется переход на новую
строку. Такой вывод полезен при манипуляциях с именами
файлов, когда эти имена необходимо удлинять или созда-
вать новые.




- 59 -










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

hashstat
распечатывает строку статистики, определяющую, нас-
колько эффективно внутренняя таблица хеширования разме-
щает команды. Данная команда является отладочной.

history
history -r
history n
history -r n
history -h


выводит списки из протокола. По ключу -r строки выво-
дятся в обратном порядке. Если указано число n, то
выводятся только n строк протокола. С ключом -h выво-
дятся строки протокола в формате файла ~/.history.

if(выражение) команда
если выражение истинно (не равно нулю), то выполняется
команда. Команда должна быть одна. Не допускается при-
менение последовательности команд и/или конвейера.
Интерпретатор вычисляет истинность выражения после
подстановок как в команде, так и в выражении.

if(выражение_1) then
...
else if(выражение_2) then
...
else
...
endif


если значение выражения_1 истинно, выполняются команды
до первого else. Иначе, если значение выражения_2
истинно, выполняются команды до второго else и т.д.
Возможно любое количество пар else-if; endif нужен
только один. Часть else является необязательной. Слова
else и endif должны быть первыми в строках, где они
указаны. if должен находиться один в строке или после
else.

jobs
jobs -l


- 60 -










вывести таблицу процессов. Формат jobs -l выводит более
полную информацию. Интерпретатор обеспечивает работу с
внутренними и системными идентификаторами процессов.
Системные идентификаторы процессов выводятся командой
ps или jobs с ключом -l, внутренние - командой jobs.
Пользователю предоставляется возможность не обращаться
к системным идентификаторам, а указывать в командах
управления процессами внутренние идентификаторы. Внут-
ренний идентификатор процесса печатается в квадратных
скобках. Символом + помечается последний из приоста-
новленных процессов; символом - предпоследний из приос-
тановленных процессов.

kill %внутренний_идентификатор_процесса ...
kill -SIG %внутренний_идентификатор_процесса ...
kill %шаблон_имени_процесса ...
kill -SIG %шаблон_имени_процесса ...
kill системный_идентификатор_процесса ...
kill -SIG системный_идентификатор_процесса ...
kill -l


если SIG не указан, то процессам посылается сигнал TERM
(окончить). Сигнал SIG указывается либо числом, либо
именем без шаблона SIG (как это определено в
/usr/include/signal.h). kill -l выводит список имен
сигналов.

limit тип_ресурса максимальный_размер
limit тип_ресурса
limit


для 32-разрядных машин существует возможность ограниче-
ния ресурсов системы, выделяемых одному процессу.
Ограничивается потребление текущим процессом и каждым,
который создается, так, что ни один из этих процессов
отдельно не превышает максимальный размер заданного
ресурса. Если значение максимальный размер не задано,
выводится значение текущего ограничения; если значение
тип_ресурса не задано, выводятся все установленные
ограничения. Текущее управление ресурсов включает
время процессора cputime (максимальное число секунд
центрального процессора, отводимое каждому процессу),
размер файла filesize (максимальный размер одного
файла, который можно создать), размер сегмента данных
datasize (максимальное увеличение области данные_+_стек
с помощью sbrk(2) за границу текста программы), размер
стека stacksize (максимальный размер автоматически рас-
ширяемой области стека), размер дампа coredumpsize
(максимальный размер дампа, который будет создан).
Максимальный размер ресурса может быть задан в виде
числа (целого либо с точкой), за которым следует


- 61 -










указатель размерности. Для задания имен типов ресурсов
и указателей размерности достаточно задавать уникальные
шаблоны имен.

login
login имя


по команде login завершается сеанс работы пользователя.
Команду login можно выполнять без аргумента имя и с
ним. Во втором случае сразу же будет запрошен входной
пароль пользователя имя.

logout
указывает интерпретатору о необходимости прекратить
работу. Читается файл ~/.logout, если он имеется, и
выполняются все указанные в нем действия. Асинхронные
процессы продолжают выполняться.

nice
nice +число
nice -число
nice команда
nice +число команда