Производственно-внедренческий кооператив

                    "И Н Т Е Р Ф Е Й С"













                Диалоговая Единая Мобильная

                    Операционная Система

                        Демос/P 2.1










                       Командный язык

                          C-shell














                           Москва

                            1988















                        АННОТАЦИЯ

     Описывается  интерпретатор  командного  языка  C-shell.
Описаны  элементы языка, оператор И структура программ на C-
shell, а также встроенные возможности.





























































1.  Командный язык C-shell

     Взаимодействие пользователя и операционной системы осу-
ществляет интерпретатор команд - программа связи между поль-
зователем и операционной системой.  Основная функция интерп-
ретатора  -  создание процессов, выполняющих задание (одну и
более команд) пользователя, сформулированное в виде  предло-
жений  (командных строк) некоторого формализованного языка -
языка взаимодействия с  операционной  системой.  Такой  язык
называют командным.

     Командный язык позволяет  выполнять  различные  задания
пользователя   и  управлять  работой  операционной  системы.
Пользователи   ДЕМОС    используют   несколько   стандартных
командных  языков, однако авторы решили ограничиться подроб-
ным описанием наиболее развитого  и  популярного  из  них  -
командного языка C-shell [].

     C-shell - язык управления заданиями со свойствами  уни-
версального   языка  программирования.   Совмещение  свойств
языка управления заданиями и универсального языка программи-
рования делает C-shell во многом схожим как с универсальными
алгоритмическими языками, так и с наиболее развитыми команд-
ными  языками.  Это отражено в самом названии языка C-shell:
C - от имени  универсального  языка  программирования  Си  и
shell  -  язык  взаимодействия пользователя с системой (бук-
вально "оболочка").  В качестве программы связи между  поль-
зователем и операционной системой используется интерпретатор
csh, предназначенный для разбора и выполнения предложений на
языке  C-shell.   Интерпретатор csh работает в двух режимах:
интерактивном и неинтерактивном.

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

     В неинтерактивном  режиме  выполняется  командный  файл
(программа на языке C-shell), в котором содержатся командные
строки и управляющие конструкции (операторы языка C-shell).

1.1.  Лексическая структура языка C-shell

     Предложение  на  языке  C-shell  формулируется  в  виде
командной  строки,  которая  может  содержать  команду ДЕМОС
(например, /bin/cat), внутреннюю команду интерпретатора  csh
(например,  cd),  оператор  языка  программирования  C-shell
(например, оператор цикла while).




                           - 3 -










     Командная строка состоит из списка слов и их разделите-
лей.   Слово  может включать имя переменной, файла, метасим-
волы и конструкции из них. Интерпретация  слова  может  при-
вести  к  тому,  что слово будет заменено списком слов, т.е.
строкой.  В число переменных могут входить переменные, опре-
деленные  программистом, так называемые переменные окружения
(с ними мы познакомимся ниже), и предопределенные переменные
интерпретатора  csh.  В общем случае интерпретатор csh выде-
ляет следующие лексемы в командной строке:  слово,  раздели-
тель слов и метасимвол.

     Слово - это завершенная конструкция, которую распознает
интерпретатор  csh.   Разделителями  слов в командной строке
могут быть пробелы, табуляции и перечисленные ниже символы:

      ;    (    )    <&lt;    >&gt;    &    |

Если необходимо использовать эти символы  в  качестве  части
слова, а не разделителя, то применяется экранирование симво-
лом \. Например, если символу ; предшествует  символ  \,  он
будет восприниматься не как разделитель группы команд, а как
символ ';' слова,  которому  принадлежит.   Некоторая  часть
символов образует класс так называемых метасимволов - симво-
лов, имеющих специальное значение.  Каждый из  перечисленных
ниже  символов  имеет  специальное значение в языке C-shell.
Специальное значение символа определяется  контекстом  слова
или командной строки

      !    #    $    %   :    *    ,    ?

      [    ]    {    }   @    ~    .    ^

Символ \ отменяет специальное значение части указанных мета-
символов.

     После разбора командной строки и  подстановки  значений
переменных  слово может "превратиться" в строку или остаться
словом, например именем файла.  Интерпретатор csh  позволяет
оперировать строками, полученными в результате интерпретации
слов в командной строке, осуществлять различные преобразова-
ния:

             "строка"    'строка'    `строка`

Кавычки используются для управления режимом  грамматического
разбора и интерпретации командной строки.  Двойные и одинар-
ные кавычки можно экранировать символом \.   Если  командная
строка  занимает  более одной строки, то ее можно продолжить
на следующей, поставив в конце символ \.

     Строка, заключенная в двойные кавычки, интерпретируется
csh,  в ней используются специальные значения метасимволов и
выполняются подстановки значений переменных.


                           - 4 -










     Строка, заключенная в одинарные правые кавычки  (апост-
рофы),  не интерпретируется. Все метасимволы и их последова-
тельности теряют свое специальное значение. В некоторых слу-
чаях символы

      ?   .   *   !   ~

сохраняют свое специальное  значение  и  интерпретируются  в
такой строке.

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

     Ниже перечислены лексемы - имена  операторов  языка  C-
shell и внутренних команд интерпретатора csh:

     alias      endsw      logout     suspend
     alloc      eval       newgrp     switch
     bg         exec       nice       time
     break      exit       nohup      umask
     breaksw    fg         notify     unalias
     case       foreach    onintr     unhash
     cd         glob       popd       unlimit
     chdir      goto       pushd      unset
     continue   hashstat   rehash     unsetenv
     default    history    repeat     wait
     dirs       if         set        while
     echo       jobs       setenv
     else       kill       shift
     end        limit      source
     endif      login      stop

Имена предопределенных внутренних переменных  интерпретатора
csh:

     argv       history    nonomatch  status
     cdpath     home       notify     time
     checktime  ignoreeof  path       verbose
     child      mail       prompt
     cwd        noclobber  savehist
     echo       noglob     shell

В некоторых случаях одна лексема определяет и  имя  перемен-
ной,  и имя внутренней команды интерпретатора csh.  Тип лек-
семы определяется по контексту.  Например, команда time хро-
нометрирует выполнение простой командной строки, а предопре-
деленная переменная с именем time используется для  указания
интерпретатору,  о каких заданиях выводить результаты хроно-
метрирования.





                           - 5 -










1.2.  Форматы командных строк, перемещения по файловой  сис-
теме

     Интерпретатор csh получает  задание  в  виде  командной
строки или командного файла.  Последовательность символов от
приглашения до символа перевод строки (\n) является  команд-
ной   строкой.   Командная  строка  может  включать  простую
команду, последовательность команд, группу команд, конвейер.
Задание может выполняться в синхронном или асинхронном режи-
мах. В результате разбора командной строки интерпретатор csh
запускает на выполнение один или более процессов.

     Командой мы  называем  любой  объектный  или  командный
файл,  который  может  быть  выполнен под управлением ДЕМОС.
Например, команда

            pr -2 -w39 -l24 -t file

выведет  на  экран  дисплея  содержимое  файла  file  в  две
колонки,  строками по 39 символов и страницами по 24 строки.
Команда pr (объектный выполняемый файл  которой  размещен  в
каталоге  /bin)  выполняет  собственно  форматирование перед
выводом файла. Режимы работы команды pr задаются ключами, им
в  командной  строке предшествуют знаки минус или плюс. Знак
используется, чтобы можно было ключ отличить от имени файла.
Кроме того, в командной строке указано имя файла file, кото-
рый необходимо обработать команде pr.  Прежде чем команда pr
начнет выполняться, интерпретатор выполнит следующую работу:

     проанализирует ошибки в командной строке;


     найдет выполняемый файл в одном из каталогов (в  данном
     случае - в /bin);


     передаст его на выполнение операционной системе  вместе
     с ключами и именем файла.


     По завершению выполнения командной строки интерпретатор
csh  напечатает  приглашение (форма приглашения устанавлива-
ется пользователем).  Это значит, что можно вводить  следую-
щую командную строку.  Командная строка объединяет несколько
слов, разделенных пробелами, первое из которых - собственное
имя команды.

     Часто бывает  необходимо  выполнить  последовательность
команд, в этом случае можно использовать символ ;, например:

    cat <&lt; file ; pr -2 -w39 -l24 -t file

Эта командная строка  приводит  к  выполнению  двух  команд:


                           - 6 -










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

     Для управления последовательностями команд  допускается
использование логических связок && и ||, например:

    cat <&lt; file && pr -2 -w39 -l24 -t file

В этом случае вторая команда выполнится, если успешно выпол-
нится  первая,  т.е.  если  file  существует и его разрешено
читать.

    cat <&lt; file1 || pr -2 -w79 -l24 -t file

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

     Для группирования команд используются  круглые  скобки.
Группа  команд, заключенная в скобки, выполняется как самос-
тоятельная командная строка и не влияет на внутренние  пере-
менные других частей командной строки, например:

    ls -l; ( cat <&lt; f1 && cat <&lt; f2 ) && date

Сначала выдается листинг рабочего каталога,  затем  выполня-
ется  группа команд в скобках и, если оба файла существуют и
разрешено их чтение, выполняется команда date.  Для  безоши-
бочного  разбора командной строки интерпретатором csh требу-
ется, чтобы около скобок находились либо ;, либо &&, либо |,
либо ||, либо метасимволы перенаправления ввода-вывода.

     Когда бывает необходимо  организовать  последовательную
обработку  потока данных, используются межпроцессные каналы.
Один процесс выводит поток данных в канал, другой читает  из
него. Если необходимо расширить число взаимодействующих про-
цессов, то образуется конвейер  команд.  Для  обозначения  в
командной  строке  межпроцессного  канала  выделен символ |,
например:

    cat -n <&lt; file | pr -2 -w39 -l24 -t

Команда cat проставляет номера строк в file (ключ n),  и  ее
вывод  передается  команде  pr для форматирования. Результат
выводится на экран дисплея.

    sort file | cat -n | pr -2 -w39 -l24 >&gt;>&gt; file2

Команда sort сортирует файл; cat - проставляет номера строк;
pr  - форматирует вывод и дописывает его в file2.  Команды в


                           - 7 -










конвейере можно разделять с помощью логических связок  &&  и
||, группировать круглыми скобками, разделять ;, например:

    ( cat <&lt; f1 && date ) && ( cat -n <&lt; f1 | sort ); date

Если имеется файл f1, он выводится на дисплей,  затем  выво-
дится  дата,  а команда cat, пронумеровав строки, направляет
файл на сортировку.  На экран выводятся результат сортировки
и  дата. Если f1 отсутствует или его нельзя читать, то выво-
дится только дата.

     Интерпретатор позволяет перейти к приему новой  команд-
ной  строки, не дожидаясь завершения предыдущей. Такой режим
выполнения называют асинхронным или параллельным.  Это  дает
возможность  пользователю  запустить на выполнение несколько
командных строк и продолжать работу в интерактивном  режиме.
Символ  & в конце командной строки используют, когда необхо-
димо выполнить ее асинхронно, например:

    cat -n <&lt; f1 | pr -2 -w39 -l24 -t >&gt; f2 &

Команда cat выводит строки с номерами, команда  pr  формати-
рует их, вывод направляется в f2.

     Часто при наборе  командной  строки  возникают  ошибки,
которые можно исправить простыми средствами.

     Клавиша ЗБ (DEL) дисплея используется для удаления сим-
вола, около которого находится курсор.

     Символ СУ/W (CTRL/W) позволяет удалить последнее  слово
командной строки.

     Символ СУ/U (CTRL/U) позволяет удалить всю строку.

     Перемещения по файловой системе  выполняются  командами
cd,  popd и pushd.  Интерпретатор хранит путь от регистраци-
онного к рабочему каталогу (его имя хранится  в  предопреде-
ленной переменной cwd), а также поддерживает стек каталогов,
содержимое которого  выводится  по  команде  dirs.   Команды
pushd  и popd используются для переходов по дереву каталогов
файловой системы и модификации содержимого стека  каталогов.
Команда  cd не меняет содержимого стека каталогов.  Элементы
стека нумеруются от 1, начиная от вершины стека.

     Команда popd  без  аргументов  равносильна  команде  cd
имя_номер_2  стека имен каталогов, т.е. осуществляется пере-
ход в новый каталог,  имя  которого  определяется  автомати-
чески.   Имя_номер_1  из  стека  имен  каталогов  удаляется,
остальные элементы  стека  сохраняются  с  новыми  номерами.
Команда  popd  +число  удаляет имя_номер_(1+число) из стека,
остальные элементы стека сохраняются с новыми номерами.  При
этом переход в другой каталог не осуществляется.


                           - 8 -










     Команда pushd меняет порядок имен в стеке имен  катало-
гов и увеличивает их число на 1.  Команда pushd без аргумен-
тов равносильна команде  cd  имя_номер_2  стека.   При  этом
имя_с_номером_2  ставится  в вершину, а имя_с_номером_1 - на
его место в стеке  (остальные  элементы  стека  остаются  на
своих местах).  Команда pushd каталог равносильна команде cd
каталог, при этом  каталог  записывается  в  вершину  стека,
остальные  элементы  стека  сохраняются  с  новыми номерами.
Команда    pushd    +число    равносильна     команде     cd
имя_с_номером_(1+число).   При  этом имя_с_номером_(1+число)
ставится в вершину стека,  а  число  имен  переписывается  в
конец  стека  в том порядке, в котором они следовали от вер-
шины стека. Другие элементы стека остаются без изменений.

1.3.  Управление вводом и выводом

     В ДЕМОС используются так называемые  стандартный  ввод,
стандартный  вывод и стандартный вывод диагностических сооб-
щений.  Стандартный  ввод  определяет  источник  данных  для
команды,  стандартный  вывод  - приемник данных, стандартный
вывод диагностических  сообщений  -  приемник  сообщений  об
ошибках.

     Существуют два режима управления вводом и выводом: пер-
вый  -  режим  умолчания;  второй  - режим с явным указанием
источника и/или приемника  данных.   В  режиме  умолчания  в
качестве стандартного ввода (источника) используется клавиа-
тура дисплея, в качестве стандартного вывода и  стандартного
вывода  ошибок  (приемники)  - экран дисплея.  Интерпретатор
позволяет менять  (переадресовывать)  источник  и  приемники
данных.  Переадресация осуществляется с помощью разделителей
специального вида.  Для указания направления  ввода  (источ-
ника) используются следующие разделители:

             <&lt;,    <&lt;<&lt;,    <&lt;<&lt; слово

Если разделитель не указан, ввод осуществляется с клавиатуры
дисплея (стандартный ввод).

     Для указания направления вывода  (приемника)  использу-
ются следующие разделители:

             >&gt;       >&gt;>&gt;       |
             >&gt;&      >&gt;>&gt;&      |&
             >&gt;!      >&gt;>&gt;!
             >&gt;&!     >&gt;>&gt;&!

Если разделитель не указан, вывод  осуществляется  на  экран
дисплея (стандартный вывод и стандартный вывод ошибок).

     Метасимвол & используется, когда  необходимо  сообщения
об  ошибках  выводить вместе со стандартным выводом, а не на
экран.  Метасимвол ! используется, когда необходимо временно


                           - 9 -










отменить действие некоторых ключей.

     Для управления режимами ввода-вывода используются  зна-
чения ключей noclobber, noglob и nonomatch. Если ключи уста-
новлены, то выполняется  особый  режим  выполнения  операций
ввода-вывода.  Установку и отмену ключей выполняют с помощью
команд set и unset.  Например:

            set noclobber   или   unset noclobber


     Рассмотрим подробнее управление вводом:

<&lt; имя_файла
     открывается файл, который читается вместо чтения с кла-
     виатуры дисплея;

<&lt;<&lt; слово
     в качестве ввода используется ввод с  клавиатуры  дисп-
     лея.   Ввод  прекращается, когда введенная строка будет
     идентична слову. Например:

                 cat >&gt; file <&lt;<&lt; mmm
                 0123
                 3456
                 6789
                 mmm

     Команда cat создает file  и  ждет  ввода  с  клавиатуры
     дисплея.  Каждая  введенная  строка сравнивается с mmm.
     Если она отличается от mmm,  то  записывается  в  file.
     Если она идентична mmm, ввод прекращается и file закры-
     вается.  Строка mmm в выходной файл не вводится.   Ана-
     логичную  конструкцию  можно  использовать  в командном
     файле.


     Рассмотрим подробнее управление выводом:

>&gt; имя_файла
     результат направляется в указанный файл.

>&gt;! имя_файла
     восклицательный знак отменяет действие ключа noclobber.
     Ключ  запрещает  вывод  в файл, если он к этому моменту
     существует и не является специальным файлом  (например,
     /dev/tty*).   Допустим, существуют файлы с именем file1
     и file2 и выполнена команда

         set noclobber

     Тогда команда



                           - 10 -










         cat <&lt; file2 >&gt; file1

     не выполнится, а команда

         cat <&lt; file2 >&gt;! file1

     выполнится.   Предопределенная   переменная   noclobber
     используется  как ключ, запрещающий случайное поврежде-
     ние существующих файлов.  Конструкции >&gt;!,  >&gt;>&gt;!,  >&gt;&!  и
     >&gt;>&gt;&!   отменяют  действие  этого ключа для указанного в
     командной строке файла.

>&gt;& имя_файла   или   >&gt;&! имя_файла
     в первом случае диагностические сообщения  направляются
     в  файл,  во втором - будет сделано то же, но с отменой
     действия ключа noclobber.

>&gt;>&gt; имя_файла  или  >&gt;>&gt;! имя_файла
     вывод помещается в конец файла. Если файл  отсутствует,
     то  он создается, во втором - будет сделано то же, но с
     отменой действия ключа noclobber.

>&gt;>&gt;& имя_файла  или  >&gt;>&gt;&! имя_файла
     в первом случае csh добавит диагностические сообщения в
     файл,  во втором случае будет сделано то же, но с отме-
     ной действия ключа noclobber.


     Можно запретить изменение расширения имени файла.   Для
этой  цели  используется  ключ  noglob.   В общем случае имя
файла имеет вид: основа_имени.суффикс.  Если установлен ключ
noglob,  изменение  суффиксов имен существующих файлов будет
порождать состояние ошибки. Чтобы  отменить  действие  этого
ключа  для конкретных файлов, в командных строках можно ука-
зывать те же конструкции,  что  и  при  использовании  ключа
noclobber.

     Существует  возможность  перенаправления  сообщений  об
ошибках  в  конвейере. С этой целью используется конструкция
|&. Ее использование в конвейере приведет к  тому,  что  все
диагностические сообщения будут направлены не на экран дисп-
лея (стандартный вывод ошибок), а вместе с  остальным  выво-
дом. Например, сообщения об ошибках в конвейере

    cat <&lt; file1 |& pr -w79 -l24 >&gt; file2

будут направлены не на стандартный вывод (экран дисплея),  а
через pr в file2.

1.4.  Управление процессами

     Процесс является основным объектом ДЕМОС, может  выпол-
няться  синхронно  и  асинхронно.   Синхронный процесс - это


                           - 11 -










процесс, который на все  время  выполнения  прерывает  связь
между  пользователем  и интерпретатором, асинхронный процесс
выполняется  параллельно  с  csh.   Командная  строка  может
порождать несколько процессов, каждому из которых присваива-
ется уникальный номер - идентификатор. Идентификатор исполь-
зуется для управления процессом. Существуют два типа иденти-
фикаторов процесса: системный и внутренний.  Системный иден-
тификатор  процесса выводится командой ps и относится к каж-
дому процессу.  Каждому системному  идентификатору  процесса
ставиться  в  соответствие уникальный внутренний идентифика-
тор.   Внутренний  идентификатор  процесса  известен  только
пользователю, относится ко всем процессам, порожденным одной
командной строкой, и используется для управления процессом в
командах  fg,  bg,  stop, kill, notify.  Процесс может нахо-
диться в двух состояниях - выполняться или быть  приостанов-
ленным.   Механизм  управления  процессом включает следующие
средства:

     завершение выполнения синхронного  (асинхронного)  про-
     цесса;


     приостановление (возобновление) выполнения  синхронного
     (асинхронного) процесса;


     изменение режима выполнения процесса с  синхронного  на
     асинхронный и наоборот;


     вывод  сообщения  о  состояниях  асинхронного  процесса
     после его завершения или в момент изменения;


     управление вводом-выводом при выполнении процесса;


     послать сигнал процессу;


     управление ресурсами процесса.


     Сведения о процессах хранятся  интерпретатором  в  виде
таблицы.    Актуальное  состояние  таблицы  можно  получить,
выполнив команду jobs или jobs -l. Во  втором  случае  выво-
дится  более подробная информация.  После выполнения команды
jobs получим, например:







                           - 12 -










       [1]    Остановлен   cc -c *.o
       [2]  - Остановлен   make install
       [3]  + Остановлен   red file
       [4]    Выполняется  sort file >&gt; result &
       [5]    Выполняется  mx -q -N -u -s *.m >&gt; out &

Каждая строка таблицы содержит сведения  о  конкретном  про-
цессе.  В квадратных скобках указан внутренний идентификатор
процесса.  Существует несколько способов указания  идентифи-
катора в командной строке при ссылке на элемент таблицы про-
цессов:

% или %+
     последний из приостановленных;

%-
     предпоследний из приостановленных;

%номер
     любой с таким внутренним идентификатором;

%символы
     любой с такими первыми символами строки;

%?шаблон?
     любой процесс с таким шаблоном в строке.


     Запуск синхронного процесса осуществляется в результате
выполнения командной строки, на конце которой нет символа &.
Чтобы прекратить выполнение синхронного процесса, необходимо
напечатать  символ  СУ/C  (CTRL/C).  Если  нужно  прекратить
выполнение синхронного процесса с сохранением в файле образа
памяти,  то  необходимо напечатать символ СУ/\ (CTRL/\). При
этом в рабочем каталоге будет записан файл  с  именем  core.
Файл core является копией памяти, которую занимал в ОЗУ про-
цесс в момент, когда был послан сигнал СУ/\.

     Синхронный процесс может выводить информацию  на  экран
дисплея.  В  этом случае, чтобы приостановить вывод, необхо-
димо  напечатать  символ  СУ/S  (CTRL/S),  чтобы  продолжить
выполнение,  необходимо  напечатать  символ  СУ/Q  (CTRL/Q).
Если синхронный процесс не выводит  информацию  на  дисплей,
чтобы  его  приостановить, необходимо напечатать символ СУ/Z
(CTRL/Z), а чтобы продолжить - напечатать fg или %.  Описан-
ные способы управления синхронным процессом существенно раз-
личны.  Первый используется только в случае вывода на  дисп-
лей,  второй можно использовать в любом случае.  Кроме того,
при использовании СУ/Z синхронный процесс приостанавливается
с  возобновлением работы csh, а при использовании СУ/S этого
не происходит.  Существует возможность перевести процесс  из
синхронного в асинхронный режим выполнения.  Для этого необ-
ходимо приостановить его, используя СУ/Z,  затем  напечатать


                           - 13 -










bg.  С  этого  момента  и до своего завершения процесс будет
выполняться асинхронно.

     Запуск асинхронного процесса осуществляется  в  резуль-
тате  выполнения  командной  строки,  в конце которой указан
символ &.  После  запуска  асинхронного  процесса  на  экран
дисплея выводится сообщение вида

    [число]   число

Число в квадратных скобках - внутренний  идентификатор  про-
цесса,  число без скобок - системный идентификатор процесса.
Чтобы приостановить выполнение асинхронного процесса,  необ-
ходимо напечатать

            stop %идентификатор_процесса
      или
            stop %строка

В формате stop %строка в качестве строки  используется  одна
из форм ссылки на таблицу процессов.  Допустим, имеется нес-
колько асинхронно выполняемых процессов:

    1  sort file >&gt; /tmp/result &
    2  cc *.c >&gt;& errors &
    3  lint *.c >&gt;& mymsg &

Первый можно остановить так: stop %1 или stop %sort;  второй
-  stop  %2  или stop %c; третий - stop %3 или stop %li, или
stop %?mymsg?.  Чтобы возобновить выполнение  приостановлен-
ного  процесса,  используется команда fg для запуска его как
синхронного и bg для запуска его как асинхронного.  Варианты
запуска  на  асинхронное  выполнение  приостановленного про-
цесса:

    %идентификатор_процесса &
    %строка &
    bg %идентификатор_процесса
    bg %строка
    fg %идентификатор_процесса &
    fg %строка &

Варианты запуска на синхронное выполнение  приостановленного
процесса:

    %идентификатор_процесса
    %строка
    fg %идентификатор_процесса
    fg %строка


     Часто возникает необходимость  принудительно  (до  нор-
мального  окончания) завершить работу асинхронного процесса.


                           - 14 -










При этом не важно, выполняется он или приостановлен.  В этом
случае  процессу  необходимо  послать сигнал принудительного
завершения:

            kill -KILL %идентификатор_процесса
      или
            kill -KILL %строка
      или
            kill -KILL системный_идентификатор_процесса

Для   приостановки   интерпретатора   используется   команда
suspend, так как команду СУ/Z интерпретатор игнорирует.

     Асинхронные процессы производят вывод стандартным обра-
зом. Вывод можно запретить, выполнив команду

    stty tostop

Если установлен ключ терминала tostop, все асинхронные  про-
цессы  будут  останавливаться при попытке использовать стан-
дартный вывод.  При попытке чтения с  терминала  асинхронный
процесс останавливается в любом случае. Пример:

    stty tostop
    cat <&lt; file &
    [1] 285
    jobs
    [1]  + Ждет (вывод на терминал) cat <&lt; file

Чтобы возобновить вывод, необходимо выполнить команду

            fg %1
    или
            fg %cat

Чтобы отменить ключ tostop, следует выполнить команду

    stty -tostop


     Команда kill используется для посылки сигнала процессу.
Форматы команды kill:

kill -l
     вывести список сигналов;

kill %номер или kill %строка
     послать сигнал TERM (окончить) процессу;

kill системный_идентификатор_процесса
     послать сигнал TERM процессу;




                           - 15 -










kill -SIG процесс
     послать сигнал SIG процессу.


     Сигналы задаются либо по их номерам, либо по их  именам
(как  они  заданы в /usr/include/signal.h без префикса SIG).
Обычно все сообщения об изменении состояний  процесса  выво-
дятся на экран дисплея после вывода приглашения (не в момент
выполнения другого процесса). Переменная  notify,  если  она
установлена,  обеспечивает  вывод всех сообщений асинхронно.
Можно установить режим notify для  всех  процессов  или  для
конкретного процесса:

    notify        - установлен для всех процессов;

    unset notify  - отмена режима;

    notify %номер - установлен для процесса с номером.


     Для  32-битных  машин  возникает  проблема  ограничения
ресурсов,  выделенных процессу.  Имеется возможность ограни-
чивать следующие типы ресурсов:

cputime
     максимальное  число  секунд  центрального   процессора,
     отводимое каждому процессу;

filesize
     максимальный размер файла, который можно создать;

datasize
     максимальное  увеличение  области  (данные  +  стек)  с
     помощью sbrk(2) за границу текста программы;

stacksize
     максимальный размер автоматически  расширяемой  области
     стека;

coredumpsize
     максимальный размер дампа, который будет создан.


     Для определения размера  ресурса  используется  команда
limit,  для отмены - команда unlimit.  Для всех типов ресур-
сов, кроме cputime, используется размерность k  -  Килобайты
или m - Мегабайты.  Для cputime используются ss - секунды, m
- минуты, h - часы. Для указания типа ресурсов  используются
приведенные выше ключевые слова. Примеры:






                           - 16 -










    limit cputime 1m     (1 минута)

    limit cputime 05:30  (5минут 30 секунд)

    limit filesize 2m    (размер файла до 2 Мбайт)


1.5.  Шаблоны имен файлов и каталогов

     Если слово содержит один из символов *, ?, [, ],  {,  }
или  начинается  с  символа ~ (надчеркивание), то оно стано-
вится кандидатом на подстановку имени файла.  При этом  дан-
ное  слово  рассматривается  как  шаблон, который заменяется
отсортированным в алфавитном порядке  списком  имен  файлов,
которые соответствуют шаблону. Если ни для одного возможного
варианта подстановки  имени  по  шаблону  не  находится,  то
порождается  состояние ошибки. Ниже раскрыты значения симво-
лов в шаблонах имен файлов и каталогов.

*
     соответствует любой последовательности символов. Напри-
     мер, по команде echo * будут показаны имена всех файлов
     рабочего каталога, по команде echo */*/f*  будут  прос-
     мотрены входящие каталоги и выведен список всех файлов,
     имена которых начинаются на f.

?
     соответствует одному любому символу. Пример:

         % ls f.?
         f.c
         f.o
         f.s

     будут выведены имена всех файлов  каталога,  которые  в
     качестве основы имени имеют символ f, а в качестве рас-
     ширения имени - один любой символ.

[последовательность_символов]
     соответствует любому символу  указанной  последователь-
     ности.  Пример:

         % ls f.[cso]
         f.c
         f.o
         f.s


[символ-символ]
     соответствует любому символу из лексикографически  упо-
     рядоченного диапазона. Пример:




                           - 17 -










         % ls f.[a-z]
         f.c
         f.o
         f.s

     Выводятся все файлы, расширение имени которых  -  любая
     строчная буква латинского алфавита.

 ~ (надчеркивание)
     регистрационный каталог, например по команде

         ls -l ~

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

 ~регистрационное_имя_пользователя
     регистрационный каталог пользователя. Пример:

         % ls ~Иванов

     будет  выведено  содержимое  регистрационного  каталога
     пользователя с именем Иванов.

{список_символов_через_запятую}
     соответствует любому из перечисленных символов. Пример:

         % ls f.{c,s,o}
         f.c
         f.o
         f.s


слово1{список_слов_через_запятую}слово2
     к слово1 добавляется первое  слово  из  списка  слов  и
     добавляется слово2. Далее повторяется для второго слова
     из списка слов и так  далее.  Не  допускаются  пробелы.
     Слово1 и/или слово2 могут отсутствовать.  Пример:

         % ls aaa{ddd,ccc,bbb}eee
         aaadddeee не найден
         aaaccceee не найден
         aaabbbeee не найден

     При поиске файлов формировались их  имена  комбинациями
     указанных   последовательностей.  Сообщение  не  найден
     выводится, когда такой файл командой ls не обнаружен.


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


                           - 18 -










    % echo Та{ня,ню,не,тьяна,тьяну,тьяне}
    Таня Таню Тане Татьяна Татьяну Татьяне

Возможны и более сложные применения, например:

    %echo Та{ня,тьяна,нечка}{' Иванова',' Петрова'}
    Таня Иванова Таня Петрова
    Татьяна Иванова Татьяна Петрова
    Танечка Иванова Танечка Петрова


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

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

     Выше было сказано, что если указанному шаблону не соот-
ветствует  ни  одно  имя, то порождается состояние ошибки. В
некоторых случаях это может привести к нежелательному  прек-
ращению  выполнения  задания.   Существует ключ, связанный с
шаблонами и именами файлов, - nonomatch.  Если  он  установ-
лен,  интерпретатор csh сообщает, что указанному в командной
строке шаблону не соответствует ни один файл  в  каталоге  и
этот шаблон выводится на стандартный вывод. Пусть, например,
имеются файлы f.1, f.2 и f.3.  Выполним команду  echo  f.[4-
9], получим сообщение об ошибке:

    echo: Нет таких имен.

Теперь выполним команды

    set nonomatch; echo f.[4-9]

получим сообщение: f.[4-9].  В первом случае  было  выведено
сообщение  команды  echo  об  ошибке.   Во втором случае был
выведен шаблон f.[4-9],  относительно  которого  не  удалось
подобрать  имя файла.  Принципиальное отличие второго случая
от первого заключается в том, что не  порождалось  состояние
ошибки - просто был выведен шаблон.

1.6.  Подстановки значений переменных

     В языке C-shell определены следующие  типы  переменных:
слово, строка, массив слов, позиционная переменная.

     В отличие от других языков программирования, когда ука-
зание  имени  переменной  (например, в выражении) приводит к
подстановке ее значения,  в  языке  C-shell  требуется  явно


                           - 19 -










указывать, когда собственно необходимо использовать значение
переменной.  Определить переменную и присвоить  ей  значение
можно с помощью команды set или присвоив переменной значение
выражения (например, @ a = 5).  Подстановка  значений  пере-
менных  выполняется  после подстановки имен команд и файлов,
если перед именем переменной указан без  пробела  символ  $.
Символы  ?, # используются для управления режимами подстано-
вок. Имеются следующие типы подстановок:

     подстановка собственного значения переменной;


     подстановка собственного значения позиционной  перемен-
     ной;


     подстановка информации о переменной,  например  опреде-
     лена она или нет.


     Позиционные  переменные  инициализируются  в  командной
строке при запуске командного файла на выполнение. Например,

    comfile aaa bbb ccc ddd

каждое слово этой командной строки доступно  внутри  команд-
ного  файла  comfile.  Чтобы получить значение слова, доста-
точно указать его номер в строке, например вместо $0 подста-
вится  comfile, вместо $3 - ccc.  Рассмотрим примеры простых
подстановок.

    % set a = 5
    % echo a
    a
    % echo $a
    5

Действие символа $ можно отменить, указав перед  ним  символ
\.  Например:

    % set a = 5
    % echo \$a
    $a
    % echo $a
    5

В последовательности символов,  взятых  в  двойные  кавычки,
всегда действует символ $, например:







                           - 20 -










    % set a = 5
    % echo \$a
    $a
    % echo "\$a"
    \5
    % set b = "Миша, Валера, $a."
    % echo $b
    Миша, Валера, 5.
    %
    % set b = "Миша, Валера, \$a."
    % echo $b
    Миша, Валера, \5.


     В последовательности символов, взятых в одинарные  пра-
вые кавычки, действие символа $ отменяется, например:

    % set a = 5
    %set b = 'Миша, Валера, $a.'
    % echo $b
    Миша, Валера, $a.
    %
    % set b = 'Миша, Валера, \$a.'
    % echo $b
    Миша, Валера, \$a.

В последовательности  символов,  взятых  в  одинарные  левые
(обратные) кавычки, символ $ приводит к подстановке перемен-
ной.  Подстановка происходит непосредственно перед  выполне-
нием команды, взятой в левые кавычки.  Пример: пусть имеется
командный файл f.csh:

    # !/bin/csh
    set a = 1  b = '`echo $v`'  c = 3
    echo a = $a b = $b c = $c
    set v = 100
    @ b++
    echo b = $b
    @ d = ( $a + $b + $c )
    echo d = $d

Первая  строка  начинается  символом  #  -  так  в  C-shell-
программе  обозначается строка-комментарий. Запись !/bin/csh
указывает, что командный файл должен выполняться интерпрета-
тором csh.  В результате выполнения получим:

    % f.csh
    a = 1 b = `echo $v` c = 3
    b = 101
    d = 105

Здесь переменным a, b, c и v присваиваются различные  значе-
ния,  которые  затем  используются  в вычислениях в строках,


                           - 21 -










помеченных символом @. Все действия  сопровождаются  выводом
значений  переменных.  В строке set b = '`echo $v`' перемен-
ной  b  присваивается  строка  символов.   Одиночные  правые
кавычки  запрещают подстановку команде set и при выводе зна-
чения b имеем: b = `echo $v`.  В строке  @  b++  выполняется
команда  `echo  $v`  (это  значение  переменной  b  к  этому
моменту), после чего значение переменной b увеличивается  на
1.  Величина b равна теперь 101 и используется далее.

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

    % set a = 'Опер'
    % echo ${a}ционная система
    Операционная система
    % echo ${a}ция
    Операция
    % echo Исследование ${a}аций
    Исследование Операций

Ниже перечислены все формы подстановок в различных режимах:

$переменная или ${переменная}
     подставляется значение переменной; {} выделяют перемен-
     ную от других символов, идущих следом без разделителя;

$переменная[номер] или ${переменная[номер]}
     подставляется слово номер из массива слов;

$?переменная или ${?переменная}
     подставляется 1, если переменная определена, иначе 0;

$$
     подставляется десятичный номер процесса csh;

$#переменная или ${#переменная}
     подставляется количество слов, хранящихся в массиве;

$?0 или ${?0}
     подставляется 1, если входной файл определен, иначе 0;

$0
     подставляется имя файла, который в данный  момент  вре-
     мени выполняет интерпретатор;

$число или ${число}
     эквивалентно $argv[число];

$*
     эквивалентно  $argv[*],  т.е.  это  строка   параметров
     команды, которой был запущен csh.


                           - 22 -










     Ниже приведены примеры различных вариантов  использова-
ния  подстановок  в командном файле f.csh.  Показаны 23 раз-
личных случая использования подстановок, каждый случай выде-
лен строкой комментариев.  За символом # в комментариях ука-
заны номера вариантов.  Чтобы легче было  ориентироваться  в
выводе  результатов,  он организован таким образом, что сна-
чала выводится номер варианта, потом результат его  выполне-
ния:















































                           - 23 -










    # !/bin/csh
            set m = ( w1 w2 w3 w4 w5 )
    # 1 - 2
            if( $?m ) then
                    echo 1 $m
            else
                    echo 2 0
            endif
    # 3 - 4
            if( ${?m} ) then
                    echo 3 $m
            else
                    echo 4 0
            endif
    # 5 - 6
            if( $?0 ) then
                    echo 5 1
            else
                    echo 6 0
            endif
    # 7 - 8
            if( ${?0} ) then
                    echo 7 1
            else
                    echo 8 0
            endif
    # 9
            echo 9  $$
            @ p = ( $$ + 10 )
    # 10
            echo 10 $p
            date >&gt; ofile$$
    # 11
            echo  "11  `ls ofile$$`"
            cat ofile$$
            set p = 2
            @ p++
    # 12 - 17
            echo  12 p = $p
            echo  13 ${p}aaa
            echo  14 $m[1]
            echo  15 $m[5]
            echo  16 $m[2-4]
            echo  17 ${m[3]}aaa
    # 18 - 23
            set p = $#m
            echo  18 $p
            echo  19 ${#m}aaa
            echo  20 $0
            echo  21 $3
            echo  22 ${3}ddd
            echo  23 $*



                           - 24 -










Запустим на выполнение  этот  командный  файл  со  следующим
списком  аргументов:  11  22  33 44 55 66.  После выполнения
получим:

    % f.csh 11 22 33 44 55 66
    1 w1 w2 w3 w4 w5
    3 w1 w2 w3 w4 w5
    5 1
    7 1
    9 525
    10 535
    11  ofile525
    Вос Июл 10 22:57:20 MSK 1988
    12 p = 3
    13 3aaa
    14 w1
    15 w5
    16 w2 w3 w4
    17 w3aaa
    18 5
    19 5aaa
    20 f.csh
    21 33
    22 33ddd
    23 11 22 33 44 55 66

Результаты всех вариантов, кроме 11, легко объяснимы.  Здесь
номер  процесса используется для создания файла с уникальным
именем. Этот прием часто используют, когда необходимо  полу-
чить такой файл.  Варианты 20 - 23 демонстрируют использова-
ние переменной argv. Эта переменная получает  свое  значение
из  командной  строки  f.csh  11  22 33 44 55 66, которую мы
ввели при запуске командного файла.

     Конструкция $<&lt; используется для чтения строки с клавиа-
туры  дисплея.  Если в списке переменных указана конструкция
$<&lt;, то интерпретатор ждет ввода с клавиатуры дисплея и заме-
няет $<&lt; на напечатанную строку

















                           - 25 -










    % set цвета = $<&lt;
    красный синий зеленый
    % echo $цвета
    красный синий зеленый
    % @ aaa = 1 + $<&lt; + 3
    2
    % echo $aaa
    6
    % echo $<&lt;
    красный синий зеленый
    красный синий зеленый
    % set цвета = ( красный синий зеленый $<&lt; серый )
    белый
    % echo цвета: $цвета
    цвета: красный синий зеленый белый серый
    % echo $цвета[4]
    белый
    % set цвета[4] = $<&lt;
    голубой
    % echo $цвета[4]
    голубой

В некоторых версиях интерпретатора  csh  конструкция  $<&lt;  не
используется.  В  этом случае можно воспользоваться командой
системы rline, например:

    % set a = `rline`
    ДЕМОС
    % echo $a
    ДЕМОС


1.7.  Модификаторы переменных

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

    модифицируемое_слово:модификатор

Ниже перечислены все формы использования модификаторов:

h    удалить имя файла, сохранив компоненты  пути  (то  есть
     удалить в слове текст справа до ближайшего символа /);

gh   применить модификатор h глобально, ко всем словам;

r    удалить расширение имени файла, указанное через  точку,
     и саму точку;



                           - 26 -










gr   выполнить модификатор r глобально, ко всем словам;

e    удалить имя файла вместе с точкой, сохранив  расширение
     имени;

ge   выполнить модификатор e глобально, ко всем словам;

t    сохранить имя файла, удалив компоненты  пути  (то  есть
     удалить  текст  слева от самого правого символа / и сам
     этот символ);

gt   применить модификатор t глобально, ко всем словам;

q    запретить дальнейшую модификацию слова. Слово  заключа-
     ется в кавычки;

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


     Бессмысленно применять модификаторы к следующим синтак-
сическим формам подстановок:

    $?переменная
    ${?переменная}
    $?0
    $$


     В каждой подстановке  можно  использовать  только  один
модификатор.  Перед модификатором должен стоять символ двое-
точие.  Если в подстановке используются символы {},  модифи-
катор должен находиться внутри фигурных скобок.  В командном
файле f.csh показаны примеры использования модификаторов:





















                           - 27 -










    #!/bin/csh
            set a = /usr/bin/pr1
            set b = /dir1/dir11/dir111/file.c
            set c = (/d/d1/d2/f.c /d/d1/c.c /d5/f.s )

    # Вариант 1
            echo 'Вариант 1'
            echo $a:h
            echo $b:h
            echo $c[1]:h
            echo ${c[2]:h}
            echo $c[3]:h

    # Вариант 2
            echo 'Вариант 2'
            echo $a:t
            echo $b:t
            echo $c[1]:t
            echo ${c[2]:t}
            echo $c[3]:t

    # Вариант 3
            echo 'Вариант 3'
            echo $a:r
            echo $a:e
            echo $b:r
            echo $b:e
            echo $c[1]:r
            echo $c[1]:e
            echo ${c[2]:r}
            echo ${c[2]:e}
            echo $c[3]:r
            echo $c[3]:e

    # Вариант 4
            echo 'Вариант 4'
            echo $c:gh
            echo $c:gt
            echo $c:gr

    # Вариант 5
            echo 'Вариант 5'
            set m = "$c:x"
            echo $m
            echo $m[1]:t
            echo $m[1]:r

    # Вариант 6
            echo 'Вариант 6'
            set m = "$c:q"
            echo $m
            echo $m[1]:h
            echo $m[1]:r


                           - 28 -










После выполнения командного файла получим:

    % f.csh
    Вариант 1
    /usr/bin
    /dir1/dir11/dir111
    /d/d1/d2
    /d/d1
    /d5
    Вариант 2
    pr1
    file.c
    f.c
    c.c
    f.s
    Вариант 3
    /usr/bin/pr1
    пустая строка
    нет расширения имени у файла pr1
    /dir1/dir11/dir111/file
    c
    /d/d1/d2/f
    c
    /d/d1/c
    c
    /d5/f
    s
    Вариант 4
    /d/d1/d2 /d/d1 /d5
    f.c c.c f.s
    /d/d1/d2/f /d/d1/c /d5/f
    Вариант 5
    /d/d1/d2/f.c /d/d1/c.c /d5/f.s
    f.s
    /d/d1/d2/f.c /d/d1/c.c /d5/f
    Вариант 6
    /d/d1/d2/f.c /d/d1/c.c /d5/f.s
    /d/d1/d2/f.c /d/d1/c.c /d5
    /d/d1/d2/f.c /d/d1/c.c /d5/f


     Вывод  результатов  организован  таким  образом,  чтобы
можно  было отличить действия каждого варианта использования
модификаторов.  Варианты 5 и 6 демонстрируют действия  моди-
фикаторов  x  и  q . Переменная c содержит список слов. Этот
список присваивается переменной m и к нему поочередно приме-
няются  модификаторы x и q.  Из примера видно, что этот спи-
сок превращается в одно слово, и модификаторы h, t и r рабо-
тают с этим списком как с одним словом.






                           - 29 -










1.8.  Выражения

     Символ @ в начале строки означает,  что  все  указанные
далее слова образуют выражение, например:

    % set a = 5  b = 7
    % @ c = ( $a + $b )
    % echo $c
    12


     В  языке  C-shell  числом  считается  любая  символьная
строка,  которая может интерпретироваться как целое десятич-
ное число.  Если в выражении применяется строка, которая  не
может  интерпретироваться  как  число, порождается состояние
ошибки.  В качестве логических значений  используются  числа
(0  -  ложь  и  1 - истина). Как истина воспринимается любое
число, отличное от нуля.  Выражения и операции в  C-shell  в
основном  аналогичны  операциям  в языке Си. Выражения можно
использовать также в операторах if_then_else, while, exit. В
выражение   в  качестве  простого  операнда  можно  включать
команду системы, взятую в фигурные скобки. В процессе вычис-
лений  эта  команда будет выполнена, и результат будет подс-
тавлен в выражение.   В  выражениях  используются  следующие
операции:

операции сравнения строк

         ==   или  =~   равно?

         !=   или  !~   не равно?

     В  качестве  операндов  в  этих  операциях  применяются
     строки.  В формах с символом ~ разрешается использовать
     в правой части шаблоны *, ? и [...].  Эта форма сравне-
     ния  строк  сокращает  количество  конструкций switch в
     командных файлах.

операции над числами
















                           - 30 -










          операнд_целое_число:
                 (два операнда):
                              ||   или
                              &&   и
                              <&lt;=   меньше или равно?
                              >&gt;=   больше или равно?
                               >&gt;   больше?
                               <&lt;   меньше?
                               +   сложить
                               -   вычесть
                               *   умножить
                               /   делить
                               %   остаток деления
                 (один операнд):
                              ++    инкремент,
                                   (постфиксная)
                              --    декремент,
                                   (постфиксная)
          поразрядные_логические:
                               &    умножение
                               |    сложение
                               ^    исключающее или
                               ~    дополнение
                                   (унарная)
                               !    отрицание
                                   (унарная)
                              >&gt;>&gt;    сдвиг вправо
                              <&lt;<&lt;    сдвиг влево


операции опроса свойств файла:
     они записываются в виде -код имя_файла, где код -  одна
     из следующих букв, обозначающих операцию:

         r (можно ли читать?)
         w (можно ли писать?)
         x (можно ли выполнять?)
         e (файл существует?)
         o (выполняющий владелец файла?)
         z (размер файла = 0 ?)
         f (файл зашифрован?)
         d (файл - это каталог?)

     Если файл обладает требуемым свойством, то возвращается
     значение истина, иначе ложь.

     Строка с выражением может иметь следующие форматы:

символ @
     распечатать значения всех переменных;

@ имя операция_присваивания выражение
     присвоение переменной имя значения выражения;


                           - 31 -










@ имя[целое] операция_присваивания выражениe
     присвоение значения выражения элементу массива.


     Операции  присваивания  аналогичны  подобным  операциям
языка Си:

       =  +=  -=  *=  /=  %=

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

       ||,  &&,  | ,  ^ ,  & ,  ==,  !=,

       <&lt;=,  >&gt;=,  <&lt; ,  >&gt; ,  <&lt;<&lt;,  >&gt;>&gt;,  + ,

       - ,  * ,  / ,  % ,  ! ,  ~ , ( )

Внутри указанных ниже групп операции имеют одинаковый  прио-
ритет:

       [ =~, !~, ==, != ]
       [  <&lt;,  >&gt;, <&lt;=, >&gt;= ]
       [         <&lt;<&lt;, >&gt;>&gt; ]
       [          +,  - ]
       [      *,  /,  % ]


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

     Ниже  приведен  пример  командного  файла,  содержащего
строки с выражениями:
















                           - 32 -










    # !/bin/csh
    # вариант 1
            set a = 5
            @ a++
            echo $a
            # результат: 6

    # вариант 2
            @ a = 7
            echo $a
            # результат: 7

    # вариант 3
            set a = 10  b = 15
            @ c = ( $a + $b )
            echo $c
            # результат:  25

    # вариант 4
            @ c += 5
            echo $c
            # результат:  30

    # вариант 5
            @ c = ( $c * 5 )
            echo $c
            # результат:  150

    # вариант 6
            @ c *= 5
            echo $c
            # результат:  750

    # вариант 7
            @ c *= $c
            echo $c
            # результат:  -27324

    # вариант 8
            set  a = 5  b = 7  c = 9
            @ a = ( $a << 2 )
            @ b = ( $b >> 2 )
            @ c = ( $c + $a + $b )
            echo $a $b $c
            # результат:  20 1 30

    # вариант 9
            set a = 5  b = 3
            @ c = ( $a | $b )
            echo $c
            # результат:  7

    # вариант 10


                           - 33 -










            set a = 5 b = 3 c = 2
            @ d = ( ( $a + $b ) + ( $a + $b + $c ) )
            echo $d
            # результат:  18

    # вариант 11
            set a = 5
            if( "$a" == "5" ) echo 'Строки идентичны'
            if( "$a" != "5" ) echo 'Строки различны '
            # результат:  Строки идентичны

    # вариант 12
            date >&gt; file
            chmod 755 file
            if( -x file ) echo 'Выполняемый'
            # результат:  Выполняемый

Варианты 1 - 6 самообъяснимы. В варианте 7 получилось  отри-
цательное  число, так как C-shell оперирует переменными типа
integer (два байта на 16-разрядной ЭВМ).

     В  выражениях  можно  использовать   операции   запроса
свойств файла:

    % set c = 0
    % @ c = -x  a.out  + 100
    % echo $c
    101
    % @ c = 100 - -x a.out
    % echo $c
    99


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

    % @ c = 100 - { date }
    сре фев 3 14:48:37 МСК 1988
    % echo $c
    99
    % @ c = { date rrrjjj } - 100
    Дата: плохой формат
    % echo $c
    -100


     Имеются полезные различия в операциях сравнения строк:







                           - 34 -










      ==    !=

      или

      =~    !~

В первом случае в правых частях сравнения  не  интерпретиру-
ются шаблоны

      ?  .  *   [...]

во втором - интерпретируются. Пусть в рабочем каталоге  име-
ются файлы и каталоги, тогда

    % set c = "*"
    % if( "$c" == "*" ) _____

      или

    % if( "$c" =~ "*" ) _____

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

1.9.  Операторы языка C-shell

     Язык C-shell  включает  следующие  операторы:  foreach,
switch,  while,  if_then_else, goto, continue, break, shift,
exit.  Операторы можно использовать в  интерактивном  режиме
работы интерпретатора csh и в командном файле.  Принципиаль-
ных различий выполнения операторов в интерактивном режиме  и
в командном файле нет.  Рассмотрим работу операторов в инте-
рактивном режиме.  В процессе ввода оператора  интерпретатор
приглашает  символом  ?  продолжать  набор, пока не встретит
ключевое слово,  означающее  конец  ввода.  Введенный  текст
можно  рассматривать  как  временный командный файл, который
интерпретируется и после выполнения уничтожается.   Одно  из
ключевых  слов foreach, switch, while, if_then_else или goto
должно быть первым словом в строке.

Оператор цикла foreach

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

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



                           - 35 -










         % foreach i  ( a b c d e f g h )
         ?        if( "$i" == "c" ) continue
         ?        glob  "$i "
         ?        if( "$i" == "f" ) break
         ? end
         a b d e f %

     Переменная цикла i последовательно  принимает  значения
     из  списка,  объявленного в предложении foreach. Внутри
     цикла стоят две проверки.  Если значение i равно c,  то
     перейти  к следующему шагу цикла, если значение i равно
     f, то прекратить выполнение  цикла.   В  первом  случае
     оператор  continue  требует  перехода  к новой итерации
     цикла, во втором - оператор break осуществляет выход за
     пределы  цикла,  и  его действие прекращается.  Команда
     glob работает аналогично команде echo, но после  вывода
     курсор  остается в той же строке, а не в начале следую-
     щей.

Оператор выбора switch имеет вид:

         switch(входная_строка)
                 case образец:
                         ...
                         breaksw
                 ...
                 default:
                         ...
                         ...
         endsw

     Образцы вариантов case последовательно  сравниваются  с
     указанной  в  switch  входной строкой (в образцах можно
     использовать шаблоны имен файлов *, ? и [...]).  Если в
     варианте  case  выявлено  совпадение  образца и входной
     строки, выполняются все строки до  ближайшего  breaksw,
     default  или  endsw.   Если  совпадение  не обнаружено,
     выполнение продолжается после  default.   Если  default
     отсутствует,   выполнение   продолжается  после  endsw.
     Слова case и default  должны  быть  первыми  в  строке.
     Выполнение  оператора  breaksw  приводит  к  тому,  что
     управление передается на первую строку после endsw













                           - 36 -










         % set j = 0
         % foreach i ( aaa bbb ccc ddd eee )
         ?       @ j++
         ?       switch( $i )
         ?               case "aaa":
         ?                       glob "$i "
         ?                       breaksw
         ?               case "bbb":
         ?                       glob "$i "
         ?                       breaksw
         ?               case "ccc":
         ?                       glob "$i "
         ?                       breaksw
         ?               case "ddd":
         ?                       glob "$i "
         ?                       breaksw
         ?               default:
         ?                       breaksw
         ?
         ?       endsw
         ?       glob "$j "
         ?end
         aaa 1 bbb 2 ccc 3 ddd 4 5 %

     Переменной цикла i присваиваются значения из  списка  в
     предложении  foreach.   Внутри  цикла  работает switch.
     Если ни одно значение вариантов case  не  совпадает  со
     значением переменной i, то выполняется вариант default.
     В данном случае это приводит к выходу за пределы перек-
     лючателя  switch,  поэтому  выводится  порядковый номер
     итерации цикла и foreach выполняет следующую  итерацию.
     В  новой  итерации  цикла  снова  начинает  действовать
     switch.

Оператор if

         if(выр1) then
            ...
         else if(выр2) then
            ...
         else
            ...
         endif

     Если значение выр1 истинно (отлично от нуля),  выполня-
     ются команды до первого else. Иначе, если значение выр2
     истинно, выполняются команды до  второго  else  и  т.д.
     Возможно  любое  количество  пар  else  if, endif нужно
     только одно. Часть else  необязательна.  Слова  else  и
     endif  должны  быть первыми в строках, где они указаны.
     Оператор if должен находиться один в строке  или  после
     else



                           - 37 -










         % foreach i ( a b c d e f )
         ?        if( "$i" == "a" ) then
         ?                glob "a "
         ?        else if( "$i" == "b" ) then
         ?                glob "b "
         ?        else if( "$i" == "c" ) then
         ?                glob "c "
         ?        endif
         ? end
         a b c %

     На каждой итерации цикла  foreach  осуществляется  про-
     верка  текущего значения переменной цикла i с символами
     'a', 'b' и выполняется, то  на  экран  выводится  соот-
     ветствующий символ, иначе осуществляется следующая ите-
     рация цикла.

Оператор цикла while

         while(выражение)
                 ...
         end

     Цикл выполняется, пока истинно значение выражения. Клю-
     чевые  слова while и end должны находиться на отдельных
     строках. В цикле можно использовать команду  break  для
     выхода  из  цикла  и команду continue для возобновления
     следующей итерации цикла без  завершения  текущей  (все
     операторы  цикла,  следующие  за  командой continue, не
     будут выполняться)

         % set argv = ( 1 2 3 1 2 3 0 1 )
         % while( $#argv > 0 )
         ?        if( "$argv[1]" == "3" ) then
         ?                shift
         ?                continue
         ?        endif
         ?        if( "$argv[1]" == "0" ) then
         ?                break
         ?        endif
         ?        glob " $argv[1]"
         ?        shift
         ? end
          1 2 1 2 %

     Здесь выполняется цикл, в  котором  выводятся  значения
     argv.  Если значение argv[1] есть символ "3", то оно не
     выводится и идет переход к  следующей  итерации  цикла,
     если символ "0", то действие цикла прекращается. Опера-
     тор shift освобождает (выталкивает) вершину  стека  для
     следующего элемента. В данном случае под стеком понима-
     ется список слов массива  argv.  После  каждого  сдвига
     argv[1]  приобретает  значение  следующего  слова. Цикл


                           - 38 -










     while прекращает работу, когда список слов массива argv
     станет пустым, т.е. $#argv станет равным нулю.

1.10.  Командные файлы

     Программы,  написанные  на  языке   C-shell,   называют
командными  файлами.  Каждая строка командного файла интерп-
ретируется csh, в ней осуществляются  подстановки,  вычисля-
ются,  если  необходимо,  выражения.   Командный  файл может
запускать на выполнение  другие  выполняемые  файлы,  в  том
числе  командные файлы, написанные для интерпретаторов csh и
sh. Кроме того, в командном файле  доступна  для  выполнения
любая команда системы.

     Каждый командный файл на  языке  C-shell  должен  начи-
наться символом # в первой позиции первой строки, далее ука-
зывается системное имя интерпретатора.   Допускаются  пустые
строки.   Строка, начинающаяся #, является строкой коммента-
риев.  При создании командных файлов, используя   переменную
argv, можно организовать ввод и обработку аргументов команд-
ной строки, которые могут быть как  именами  файлов,  так  и
любыми  последовательностями  символов.   В качестве примера
рассмотрим программу диалогового ввода содержания документа.
Комментарии в программе достаточно полно раскрывают алгоритм
работы






























                           - 39 -










     #!/bin/csh
     # Программа в режиме  меню запрашивает
     # сведения о загрузке ЭВМ.   Результат
     # ввода дописывается  в  файл  Result.
     # Исправление ошибок ввода выполняется
     # повторным  вводом.  Запись  в   файл
     # происходит  по   команде  Запомнить.
     # Переменная   out   используется  для
     # указания направления вывода.   Когда
     # out = /dev/tty вывод дописывается на
     # экран  дисплея,  когда  out = Result
     # вывод дописывается в файл ./Result.

     set ЭВМ НОМ ОРГ ПОД
     set out = /dev/tty
     set мес = ( 0 0 0 0 0 0 0 0 0 0 0 0 )
     set сум = ( 0 0 0 0 0 )

     # Имена месяцев для подтверждения
     # режима ввода

     set имя = ( Январь   Февраль Март     \
                 Апрель   Май     Июнь     \
                 Июль     Август  Сентябрь \
                 Октябрь  Ноябрь  Декабрь  )

     # Работа   программы   выполняется   в
     # бесконечном цикле while(1)

     while ( 1 )
             glob ' Укажите режим работы > '
             set ответ =  $<&lt;
             switch( "$ответ" )

                     case '[КкKk]':
                             exit( 0 )

                     case '[ЗзZz]':
                             set out = Result

                     case '[ДдDd]':

     # Вычисление показателей по  кварталам
     # и за год

     @ сум[1] = $мес[1]  +  $мес[2]  +  $мес[3]
     @ сум[2] = $мес[4]  +  $мес[5]  +  $мес[6]
     @ сум[3] = $мес[7]  +  $мес[8]  +  $мес[9]
     @ сум[4] = $мес[10] +  $мес[11] +  $мес[12]
     @ сум[5] = $сум[1]  +  $сум[2]  +  $сум[3]  +  $сум[4]

     # Очищать экран, если вывод не  в файл



                           - 40 -










                             if( "$out" != "Result" ) clear

     # Команда   echo   выводит  в файл out
     # значения переменных

             echo "                 \
               Отчет о загрузке ЭВМ.\
                    ЭВМ   $ЭВМ      \
        Заводской номер   $НОМ      \
            Организация   $ОРГ      \
          Подразделение   $ПОД      \
                 Январь   $мес[1]   \
                Февраль   $мес[2]   \
                   Март   $мес[3]   \
         Первый квартал   $сум[1]   \
                 Апрель   $мес[4]   \
                    Май   $мес[5]   \
                   Июнь   $мес[6]   \
         Второй квартал   $сум[2]   \
                   Июль   $мес[7]   \
                 Август   $мес[8]   \
               Сентябрь   $мес[9]   \
         Третий квартал   $сум[3]   \
                Октябрь   $мес[10]  \
                 Ноябрь   $мес[11]  \
                Декабрь   $мес[12]  \
      Четвертый квартал   $сум[4]   \
                  Итого   $сум[5]   " >> $out
                            continue

                    case '[АаAa]':
                            glob 'Тип ЭВМ: '
                            set ЭВМ = $<&lt;
                            continue

                    case '[БбBb]':
                            glob 'Заводской номер ЭВМ: '
                            set НОМ = $<&lt;
                            continue

                    case '[ВвWw]':
                            glob 'Организация: '
                            set ОРГ = $<&lt;
                            continue

                    case '[ГгGg]':
                            glob 'Подразделение: '
                            set ПОД = $<&lt;
                            continue

                    case '[1-9]':
                    case "1[012]":
                            glob $имя[$ответ]': '


                           - 41 -










                            set  мес[$ответ] = $<&lt;
                            continue

                    default:
     # Вывод меню, если режим указан неправильно.
                            echo 'Такого режима нет.'
                            clear
             echo  '                        \
                                            \
                                            \
                                            \
                                            \
                                            \
                  Режимы работы:            \
                                            \
     а  Ввод наименования ЭВМ.              \
     б  Ввод заводского номера ЭВМ.         \
     в  Ввод наименования организации.      \
     г  Ввод наименования подразделения.    \
     д  Вывод данных на экран.              \
     з  Запомнить.                          \
     к  Конец работы.                       \
        Вывод загрузки в часах по месяцам:  \
     1  Январь    2  Февраль    3  Март     \
     4  Апрель    5  Май        6  Июнь     \
     7  Июль      8  Август     9  Сентябрь \
    10  Октябрь  11  Ноябрь    12  Декабрь  \
                                            \
                    '
            endsw
     end

Ниже показано содержимое  файла  Result,  который  формирует
программа. Эта же информация выводится на экран, если указан
режим Вывод данных




















                           - 42 -










           Отчет о загрузке ЭВМ.
                ЭВМ   СМ 1420
    Заводской номер   1673
        Организация   Поликлиника 124
      Подразделение   ИВЦ
             Январь   300
            Февраль   350
               Март   350
     Первый квартал   1000
             Апрель   520
                Май   330
               Июнь   700
     Второй квартал   1550
               Июль   200
             Август   150
           Сентябрь   250
     Третий квартал   600
            Октябрь   300
             Ноябрь   310
            Декабрь   280
  Четвертый квартал   890
              Итого   4040


     Часто  возникает  необходимость  принять  с  клавиатуры
ответ  в  виде  метасимвола, который не должен интерпретиро-
ваться.  Этого можно достигнуть отменой специального  значе-
ния  символа.   В  отдельных  случаях такая отмена затрудни-
тельна. Ниже приведен пример программы, в которой  со  стан-
дартного ввода читаются метасимволы шаблонов имен файлов, но
их специальное значение игнорируется.
























                           - 43 -










     # !/bin/csh
     # программа демонстрирует  способ чтения
     # со стандартного ввода символов  ? и *,
     # которые  обычно  рассматриваются   как
     # шаблоны имен файлов и интерпретируются
     #
     while( 1 )
             glob '=> '
             set ответ = "$<&lt;"

             switch( "$ответ" )

                     case [?] :
                             echo 'Вопросительный знак'
                             breaksw

                     case [*] :
                             echo 'Звездочка'
                             breaksw

                     case '{' :
                     case '}' :
                             echo 'Фигурная скобка'
                             breaksw

                     default :
                             echo 'Другой символ'

             endsw
     end


1.11.  Протоколирование, средства работы с протоколом

     Интерпретатор записывает  во  временный  файл  протокол
работы  пользователя  в  виде  списка  выполненных командных
строк.  Количество запоминаемых командных строк определяется
переменной  history,  которая  обычно  определяется  в файле
~/.cshrc (о нем будет сказано ниже).  Если установлена  пре-
допределенная  переменная  savehist, то по завершению сеанса
работы пользователя указанное количество строк history будет
сохранено  в файле ~/.history. При следующем входе в систему
содержимое этого файла используется для занесения  в  прото-
кол.  Например, если выполнена команда

    set savehist = 22

то последние 22 строки протокола  будут  сохранены  в  файле
~/.history   и  восстановлены  в  начале  следующего  сеанса
работы.  Чтобы  напечатать  протокол,  необходимо  выполнить
команду  history.   Каждая строка протокола имеет номер, что
позволяет запустить ее на  выполнение,  указывая,  например,
соответствующий  номер.   Восклицательный  знак  в командной


                           - 44 -










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

    1  cat file1
    2  pr -w39 -l24 -2 file1
    3  cc program.c >&gt;& errors &
    4  cat errors
    5  ed program.c
    6  history

тогда, используя восклицательный знак, можно  выполнить  ряд
действий:

!2
     выполнится вторая строка протокола;

!!
     выполнится последняя строка протокола:

!-2
     выполнится четвертая строка (вторая от последней);

!cat или  !c
     выполнится четвертая строка.  Интерпретатор  просматри-
     вает строки протокола снизу и выполняет первую, в кото-
     рой найдена последовательность символов  (cat  или  c),
     стоящая в начале строки;

!{cat}.a1
     выполнится команда cat errors.a1 - к  найденной  строке
     дописывается .a1;

!?gram?
     выполнится пятая строка протокола.  Интерпретатор выбе-
     рет для выполнения эту строку, так как в ней будет най-
     ден шаблон gram. Здесь символы ?  выделяют  шаблон,  по
     которому осуществляется поиск;

cat !5* !1*
     выполнится команда cat program.c file1 - будут подстав-
     лены  слова  пятой  и  первой строк протокола, исключая
     первые слова этих строк.


     Можно выбирать отдельные слова в строках протокола  для
включения  их  в  командную  строку.  Слова командной строки
нумеруются, начиная с 0.  Слово с номером  0  -  обычно  имя
команды.  Слово можно выделить с помощью определителя, перед
которым необходимо указать символ двоеточие, например



                           - 45 -










       cat !3:1

Из третьей командной строки протокола будет выбрано слово  с
номером 1, получим

       cat program.c

Рассмотрим подробнее определители слов в  командных  строках
протокола:

  *   или   n*   или  n-m
     выбрать все слова, начиная со слова с  номером  1,  или
     выбрать  все  слова,  начиная со слова с номером n, или
     выбрать все слова, начиная со слова с номером n и  кон-
     чая словом с номером m;

  n  или  n-,  или  -n
     выбрать слово с номером n, или выбрать все слова, начи-
     ная  со  слова  с  номером n, не включая последнее, или
     выбрать все слова, начиная со  слова  с  номером  0  до
     слова с номером n;

  ?шаблон?:%
     выбрать слово, соответствующее шаблону;

  ^  или  $
     слово с номером 1 или последнее слово командной строки.


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

        ^     $    *   -   %

Рассмотрим пример.  Пусть после выполнения  команды  history
на экран дисплея выведен протокол:

     1  cat file1 file2 file3
     2  pr -w39 -l24 -2 file1 file5
     3  cc -o program1.c program2.c >&gt;& errors &
     4  cat errors
     5  ed program2.c
     6  history

тогда интерпретатор csh выполнит команды, осуществляя  подс-
тановки следующим образом:

!5:0  !1:3
     из пятой строки выбирается слово  с  номером  0  (  имя
     команды  ), из первой строки выбирается слово с номером
     3. Выполнится команда ed file3;




                           - 46 -










!5:0  !1$
     из пятой строки выбирается слово с номером 0, из первой
     строки - последнее слово. Выполнится команда ed file3;

!2:-3   !3:2-3
     из строки 2 выбираются слова с номерами от 0 до 3 вклю-
     чительно,  из  строки 3 выбираются слова с номерами 2 и
     3. Выполнится команда:

         pr -w39 -l24 -2 program1.c program2.c


!2-3    !?prog?%
     выполнится команда:

         pr -w39 -l24 -2 program2.c



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

p
     распечатать новую команду, но не выполнять ее;

&
     повторить предыдущюю подстановку;

s/образец_1/образец_2/
     заменить образец_1 на образец_2.  Символ / можно  заме-
     нить  на  любой,  отсутствующий в образцах.  Если обра-
     зец_2 пустая строка, то образец_1 удаляется.


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

     1  cat /usarc/gruppa/ivanov/file1.c
     2  pr  /usarc/gruppa/ivanov/file1.c
     3  cc pa1.c pa2.c pa3.c pa4.c >&gt;& errors &
     4  cat errors
     5  ed program.c
     6  history

тогда интерпретатор выполнит  команды,  осуществляя  подста-
новки и модификации, следующим образом:



                           - 47 -










!1:0  !1^:t:r
     выбирает из строки с номером 1 слово с номером 0,  т.е.
     имя  команды,  в  данном  случае cat. Далее выбирает из
     первой строки слово с номером 1, в  данном  случае  это
     /usarc/gruppa/ivanov/file1.c.   Модификатор t удалит из
     этого слова имена каталогов, в данном случае  удаляется
     /usarc/gruppa/ivanov, и слово теперь будет именем файла
     file1.c. Модификатор r удалит расширение  имени  файла.
     Таким образом, выполнится команда cat file1.

!1:0  !1^:h/document
     по определителю ^ будет  выбрано  первое  слово  первой
     строки, модификатор h удалит из него имя файла, оставив
     имена каталогов, ведущих к нему, и выполнится команда

         cat /usarc/gruppa/ivanov/document


!1:0  !1^:h:s?ivanov?sidorov?/document
     из первого слова первой строки выбираются имена катало-
     гов,  ведущих  к  файлу,  затем  модификатор  s заменит
     ivanov на sidorov и выполнится команда

         cat /usarc/gruppa/sidorov/document


!1:0 !1^:h:s?ivanov?sidorov?/doc !1^:&:p
     первые два слова командной строки действуют  аналогично
     предыдущему  примеру. Третье слово выбирает из 1 строки
     протокола слово  с  номером  1,  в  нем  осуществляется
     замена  ( модификатор & ), аналогичная предыдущей, т.е.
     выполняется  замена  ?ivanov?sidorov?,   сохранив   все
     остальное в этом слове. Строка не выполняется, а только
     выводится на экран (модификатор p):

         cat /usarc/gruppa/sidorov/doc \
         /usarc/gruppa/sidorov/file1.c


!1:0 !3:1-4:gs?pa?ff?:p
     имя команды выбирается из первой строки протокола, из 3
     строки  выбираются все слова с номерами от 1 до 4 вклю-
     чительно и в них  глобально  (модификатор  g)  делается
     замена  ?pa?ff?  .  Команда будет напечатана, но выпол-
     няться не будет (модификатор p):

         cat ff1.c ff2.c ff3.c ff4.c


     Существует также удобное средство  редактирования  пос-
ледней строки протокола.  Для этих целей используется конст-
рукция ^шаблон^замена^.  Допустим,  последняя  строка  имеет
вид  cat  aaa  bbb ccc ddd, тогда после команды ^ccc^file.c^


                           - 48 -










будет выполнена замена: cat aaa file.c ccc ddd.

     Имеется  возможность  ввести  краткие  обозначения  для
командных  строк. Эти краткие обозначения называют псевдони-
мами команд. Если для какой-либо командной строки установлен
псевдоним,  то ее выполнение теперь можно осуществлять, ука-
зывая псевдоним, а не всю строку. Допустим, имеется  команд-
ная строка

      alias sp "sort \!* | print"

тогда командные строки

      sort file1 file2 | print

    и

      sp file1 file2

тождественны.  Вместо !* в командную строку  будут  подстав-
лены имена файлов или ключи команды sort, указанные за псев-
донимом sp.

     Интерпретатор команд ведет список псевдонимов,  которые
могут  устанавливаться,  отображаться  и  модифицироваться с
помощью команд 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 +число команда
      nice -число команда


     команда установки приоритета.  В  системе  используется
     шкала  приоритетов:  [-100; +100], приоритет +100 самый
     низкий.   Первая  форма  устанавливает  приоритет   для
     интерпретатора,  равный  4,  вторая - приоритет, равный
     указанному числу, третья - приоритет для команды,  рав-
     ный  4.   Только администратор системы может установить
     отрицательный приоритет.   Для  выполнения  запускается
     новый  интерпретатор,  который  обеспечивает выполнение
     команды.  Команда должна быть одна и не может содержать
     последовательность команд, конвейер или псевдоним.

      nohup
      nohup команда


     запрещает реакцию на сигналы SIGINT  (CTRL/C),  SIGQUIT
     (CTRL/\) и SIGHUP (BREAK - отключение удаленного терми-
     нала или ЭВМ по коммутируемой линии).  Первая  форма  в
     командном  файле  устанавливает  свое  действие  на все
     строки, указанные ниже.  Вторая форма приводит к  тому,
     что  при выполнении указанной команды эти сигналы игно-
     рируются.  Для всех асинхронных процессов nohup  выпол-
     няется автоматически.





                           - 62 -










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


     дает команду на асинхронный вывод сообщений об  измене-
     ниях  состояния  процесса.   Обычно эти сообщения выво-
     дятся после  передачи  на  выполнение  новой  командной
     строки.   Если команда notify выполнена без аргументов,
     то этот режим устанавливается для всех процессов.

      onintr
      onintr -
      onintr метка


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

      popd
      popd +число


     выполняет команду cd имя_номер_2 стека имен  каталогов.
     Имя_номер_1  из стека имен каталогов удаляется, осталь-
     ные  элементы  стека  сохраняются  с  новыми  номерами.
     Форма   popd  +число   удаляет  имя_номер_(1+число)  из
     стека, остальные элементы стека  сохраняются  с  новыми
     номерами.  При  этом  переход  в другой каталог не осу-
     ществляется.

      pushd
      pushd  имя_каталога
      pushd +число


     любая форма команды pushd меняет порядок в  стеке  имен
     каталогов.     Форма   pushd   выполняет   команду   cd
     имя_номер_2 стека.  При  этом  имя_номер_2  ставится  в
     вершину,  а имя_номер_1 - на его место в стеке; осталь-
     ные элементы стека остаются  на  своих  местах.   Форма
     pushd  имя_каталога  выполняет команду cd имя_каталога,
     при этом имя_каталога  записывается  в  вершину  стека,
     остальные элементы стека сохраняются с новыми номерами.
     Форма    pushd    +число    выполняет    команду     cd


                           - 63 -










     имя_номер_(1+число).  При этом имя_номер_(1+число) ста-
     вится в вершину стека, а число имен каталогов переписы-
     ваются  в конец стека в том порядке, в котором они сле-
     довали от вершины стека, другие элементы стека остаются
     без изменений.

rehash
     обновить хеш-таблицу.

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

      set
      set имя
      set имя = слово
      set имя[индекс] = слово
      set имя = (список_слов)
      set список_присваиваний


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

      setenv
      setenv имя значение


     первая форма  выводит  значение  переменных  окружения,
     вторая  их устанавливает.  Удалить переменную окружения
     можно командой unsetenv.

      shift
      shift переменная


     осуществляет левый сдвиг списка слов переменной.  Левый
     элемент  списка исчезает. Попытка осуществить shift для


                           - 64 -










     пустого списка приводит к состоянию ошибки.

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

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


     останавливает выполнение асинхронного процесса.

suspend
     останавливает выполнение интерпретатора.

      switch( входная_строка )
             case образец_1:
                     ...
                     breaksw
             ...
             default:
                     ...
      endsw


     в образцах вариантов case сначала  выполняются  подста-
     новки.   В  образцах  вариантов case можно использовать
     шаблоны имен файлов *, ? и  [...].   Образцы  вариантов
     case  последовательно сравниваются с указанной в switch
     входной строкой.  Если не выявлено  совпадение  образца
     со   входной  строкой,  выполнение  продолжается  после
     default. Слова case и default должны стоять  первыми  в
     командной строке.  Оператор breaksw передает управление
     на строку, следующую за endsw.  Если в варианте case не
     указан  оператор  breaksw, то при совпадении с образцом
     выполняются все строки до первого breaksw или  default.
     Если  не  обнаружено  совпадение  с  образцом и default
     отсутствует, выполнение продолжается после endsw.

      time
      time команда


     при  отсутствии  параметров  печатается  итог  времени,
     израсходованного  интерпретатором  и  его потомками.  В
     качестве команды нельзя использовать псевдонимы.

      umask
      umask маска



                           - 65 -










     по умолчанию файлу устанавливается код доступа, который
     определяется  маской.   Файл будет иметь код доступа, в
     котором  маскированы  (равны  0)  биты,   установленные
     (равны  1) в маске.  Пусть маска имеет вид 123.  Первая
     цифра относится к маскированию битов доступа  для  вла-
     дельца файла и администратора, вторая - к битам доступа
     группы, а третья - к битам доступа всех остальных поль-
     зователей.   Значение  маски указывается в восьмеричном
     коде. Обычно  значением  маски  является  002,  которое
     задает  любой  доступ  для  пользователей своей группы,
     доступ для чтения и выполнения другим пользователям,  и
     022,  которое  определяет  любой доступ (за исключением
     записи) для пользователей своей группы и  всех  прочих.
     Чтобы   узнать  текущее  значение маски, надо выполнить
     команду umask без аргумента.

unalias псевдоним ...
     все псевдонимы, имена которых соответствуют  указанным,
     отменяются.  Следовательно, unalias * удаляет все псев-
     донимы.  При запуске команды без аргументов порождается
     состояние ошибки.

unhash
     запрещает использовать хеш-таблицу при поиске команды.

      unlimit   ресурс
      unlimit


     снимает ограничение на ресурс. Если ресурс  не  указан,
     снимаются ограничения на все ресурсы.

unset шаблон
     удаляются все переменные, имена  которых  соответствуют
     указанному шаблону.  Таким образом, unset * удаляет все
     переменные, установленные командой set.

unsetenv имя
     удаляется переменная из окружения.

wait
     ожидание всех выполняемых процессов.  Пока  выполняется
     команда  wait,  приглашение не печатается. Команда wait
     выполняется,  пока  не  завершатся  все  запущенные  на
     выполнение процессы.  При прерывании выполнения команды
     wait (CTRL/C или СУ/C) сообщаются имена и  номера  всех
     процессов, для которых выполнялось ожидание.

      while( выражение )
              ...
      end




                           - 66 -










     цикл выполняется, пока истинно (не равно нулю) значение
     выражения.   Ключевые  слова  while  и end должны нахо-
     диться на отдельных строках. В теле цикла можно исполь-
     зовать  break для выхода из цикла и continue для возоб-
     новления следующей итерации цикла без завершения  теку-
     щей.

















































                           - 67 -










                         СОДЕРЖАНИЕ



    АННОТАЦИЯ .........................................    2

1.  Командный язык C-shell ............................    3
1.1.  Лексическая структура языка C-shell .............    3
1.2.  Форматы командных строк, перемещения по  файловой
      системе .........................................    6
1.3.  Управление вводом и выводом .....................    9
1.4.  Управление процессами ...........................   11
1.5.  Шаблоны имен файлов и каталогов .................   17
1.6.  Подстановки значений переменных .................   19
1.7.  Модификаторы переменных .........................   26
1.8.  Выражения .......................................   30
1.9.  Операторы языка C-shell .........................   35
1.10. Командные файлы .................................   39
1.11. Протоколирование, средства работы с протоколом ..   44
1.12. Переменные интерпретатора csh ...................   49
1.13. Специальные файлы ...............................   55
1.14. Встроенные команды и операторы ..................   57

































                           - 68 -




Популярность: 12, Last-modified: Mon, 29 Jun 1998 13:54:54 GmT