На главную | Поиск
Вы находитесь в Хранилище файлов Белорусской цифровой библиотеки

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

Производственно-внедренческий кооператив "И Н Т Е Р Ф Е Й С" Диалоговая Единая Мобильная Операционная Система Демос/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 -

Last-modified: Mon, 29 Jun 1998 13:54:54 GMT
World LibraryРеклама в библиотекеБиблиотека не предназначена для детей! Проект Либмонстра, партнеры БЦБ - Украинская цифровая библиотека и Либмонстр Россия https://database.library.by