Производственно-внедренческий кооператив
"И Н Т Е Р Ф Е Й С"
Диалоговая Единая Мобильная
Операционная Система
Демос/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. Разделителями слов в командной строке
могут быть пробелы, табуляции и перечисленные ниже символы:
; ( ) << >> & |
Если необходимо использовать эти символы в качестве части
слова, а не разделителя, то применяется экранирование симво-
лом \. Например, если символу ; предшествует символ \, он
будет восприниматься не как разделитель группы команд, а как
символ ';' слова, которому принадлежит. Некоторая часть
символов образует класс так называемых метасимволов - симво-
лов, имеющих специальное значение. Каждый из перечисленных
ниже символов имеет специальное значение в языке 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 << file ; pr -2 -w39 -l24 -t file
Эта командная строка приводит к выполнению двух команд:
- 6 -
сначала file будет выведен на дисплей таким, какой он есть,
затем командой pr со всеми указанными преобразованиями.
Для управления последовательностями команд допускается
использование логических связок && и ||, например:
cat << file && pr -2 -w39 -l24 -t file
В этом случае вторая команда выполнится, если успешно выпол-
нится первая, т.е. если file существует и его разрешено
читать.
cat << file1 || pr -2 -w79 -l24 -t file
И в этом случае вторая команда будет выполнена, даже если
первая не выполнится, например если file1 отсутствует.
Слова успешно выполнится имеют определенный смысл - завер-
шившийся процесс должен вернуть код завершения, равный нулю.
В некоторых версиях команд код нормального завершения про-
цесса не равен нулю.
Для группирования команд используются круглые скобки.
Группа команд, заключенная в скобки, выполняется как самос-
тоятельная командная строка и не влияет на внутренние пере-
менные других частей командной строки, например:
ls -l; ( cat << f1 && cat << f2 ) && date
Сначала выдается листинг рабочего каталога, затем выполня-
ется группа команд в скобках и, если оба файла существуют и
разрешено их чтение, выполняется команда date. Для безоши-
бочного разбора командной строки интерпретатором csh требу-
ется, чтобы около скобок находились либо ;, либо &&, либо |,
либо ||, либо метасимволы перенаправления ввода-вывода.
Когда бывает необходимо организовать последовательную
обработку потока данных, используются межпроцессные каналы.
Один процесс выводит поток данных в канал, другой читает из
него. Если необходимо расширить число взаимодействующих про-
цессов, то образуется конвейер команд. Для обозначения в
командной строке межпроцессного канала выделен символ |,
например:
cat -n << file | pr -2 -w39 -l24 -t
Команда cat проставляет номера строк в file (ключ n), и ее
вывод передается команде pr для форматирования. Результат
выводится на экран дисплея.
sort file | cat -n | pr -2 -w39 -l24 >>>> file2
Команда sort сортирует файл; cat - проставляет номера строк;
pr - форматирует вывод и дописывает его в file2. Команды в
- 7 -
конвейере можно разделять с помощью логических связок && и
||, группировать круглыми скобками, разделять ;, например:
( cat << f1 && date ) && ( cat -n << f1 | sort ); date
Если имеется файл f1, он выводится на дисплей, затем выво-
дится дата, а команда cat, пронумеровав строки, направляет
файл на сортировку. На экран выводятся результат сортировки
и дата. Если f1 отсутствует или его нельзя читать, то выво-
дится только дата.
Интерпретатор позволяет перейти к приему новой команд-
ной строки, не дожидаясь завершения предыдущей. Такой режим
выполнения называют асинхронным или параллельным. Это дает
возможность пользователю запустить на выполнение несколько
командных строк и продолжать работу в интерактивном режиме.
Символ & в конце командной строки используют, когда необхо-
димо выполнить ее асинхронно, например:
cat -n << f1 | pr -2 -w39 -l24 -t >> 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. Управление вводом и выводом
В ДЕМОС используются так называемые стандартный ввод,
стандартный вывод и стандартный вывод диагностических сооб-
щений. Стандартный ввод определяет источник данных для
команды, стандартный вывод - приемник данных, стандартный
вывод диагностических сообщений - приемник сообщений об
ошибках.
Существуют два режима управления вводом и выводом: пер-
вый - режим умолчания; второй - режим с явным указанием
источника и/или приемника данных. В режиме умолчания в
качестве стандартного ввода (источника) используется клавиа-
тура дисплея, в качестве стандартного вывода и стандартного
вывода ошибок (приемники) - экран дисплея. Интерпретатор
позволяет менять (переадресовывать) источник и приемники
данных. Переадресация осуществляется с помощью разделителей
специального вида. Для указания направления ввода (источ-
ника) используются следующие разделители:
<<, <<<<, <<<< слово
Если разделитель не указан, ввод осуществляется с клавиатуры
дисплея (стандартный ввод).
Для указания направления вывода (приемника) использу-
ются следующие разделители:
>> >>>> |
>>& >>>>& |&
>>! >>>>!
>>&! >>>>&!
Если разделитель не указан, вывод осуществляется на экран
дисплея (стандартный вывод и стандартный вывод ошибок).
Метасимвол & используется, когда необходимо сообщения
об ошибках выводить вместе со стандартным выводом, а не на
экран. Метасимвол ! используется, когда необходимо временно
- 9 -
отменить действие некоторых ключей.
Для управления режимами ввода-вывода используются зна-
чения ключей noclobber, noglob и nonomatch. Если ключи уста-
новлены, то выполняется особый режим выполнения операций
ввода-вывода. Установку и отмену ключей выполняют с помощью
команд set и unset. Например:
set noclobber или unset noclobber
Рассмотрим подробнее управление вводом:
<< имя_файла
открывается файл, который читается вместо чтения с кла-
виатуры дисплея;
<<<< слово
в качестве ввода используется ввод с клавиатуры дисп-
лея. Ввод прекращается, когда введенная строка будет
идентична слову. Например:
cat >> file <<<< mmm
0123
3456
6789
mmm
Команда cat создает file и ждет ввода с клавиатуры
дисплея. Каждая введенная строка сравнивается с mmm.
Если она отличается от mmm, то записывается в file.
Если она идентична mmm, ввод прекращается и file закры-
вается. Строка mmm в выходной файл не вводится. Ана-
логичную конструкцию можно использовать в командном
файле.
Рассмотрим подробнее управление выводом:
>> имя_файла
результат направляется в указанный файл.
>>! имя_файла
восклицательный знак отменяет действие ключа noclobber.
Ключ запрещает вывод в файл, если он к этому моменту
существует и не является специальным файлом (например,
/dev/tty*). Допустим, существуют файлы с именем file1
и file2 и выполнена команда
set noclobber
Тогда команда
- 10 -
cat << file2 >> file1
не выполнится, а команда
cat << file2 >>! file1
выполнится. Предопределенная переменная noclobber
используется как ключ, запрещающий случайное поврежде-
ние существующих файлов. Конструкции >>!, >>>>!, >>&! и
>>>>&! отменяют действие этого ключа для указанного в
командной строке файла.
>>& имя_файла или >>&! имя_файла
в первом случае диагностические сообщения направляются
в файл, во втором - будет сделано то же, но с отменой
действия ключа noclobber.
>>>> имя_файла или >>>>! имя_файла
вывод помещается в конец файла. Если файл отсутствует,
то он создается, во втором - будет сделано то же, но с
отменой действия ключа noclobber.
>>>>& имя_файла или >>>>&! имя_файла
в первом случае csh добавит диагностические сообщения в
файл, во втором случае будет сделано то же, но с отме-
ной действия ключа noclobber.
Можно запретить изменение расширения имени файла. Для
этой цели используется ключ noglob. В общем случае имя
файла имеет вид: основа_имени.суффикс. Если установлен ключ
noglob, изменение суффиксов имен существующих файлов будет
порождать состояние ошибки. Чтобы отменить действие этого
ключа для конкретных файлов, в командных строках можно ука-
зывать те же конструкции, что и при использовании ключа
noclobber.
Существует возможность перенаправления сообщений об
ошибках в конвейере. С этой целью используется конструкция
|&. Ее использование в конвейере приведет к тому, что все
диагностические сообщения будут направлены не на экран дисп-
лея (стандартный вывод ошибок), а вместе с остальным выво-
дом. Например, сообщения об ошибках в конвейере
cat << file1 |& pr -w79 -l24 >> 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 >> result &
[5] Выполняется mx -q -N -u -s *.m >> 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 >> /tmp/result &
2 cc *.c >>& errors &
3 lint *.c >>& 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 << file &
[1] 285
jobs
[1] + Ждет (вывод на терминал) cat << 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 >> 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, которую мы
ввели при запуске командного файла.
Конструкция $<< используется для чтения строки с клавиа-
туры дисплея. Если в списке переменных указана конструкция
$<<, то интерпретатор ждет ввода с клавиатуры дисплея и заме-
няет $<< на напечатанную строку
- 25 -
% set цвета = $<<
красный синий зеленый
% echo $цвета
красный синий зеленый
% @ aaa = 1 + $<< + 3
2
% echo $aaa
6
% echo $<<
красный синий зеленый
красный синий зеленый
% set цвета = ( красный синий зеленый $<< серый )
белый
% echo цвета: $цвета
цвета: красный синий зеленый белый серый
% echo $цвета[4]
белый
% set цвета[4] = $<<
голубой
% echo $цвета[4]
голубой
В некоторых версиях интерпретатора csh конструкция $<< не
используется. В этом случае можно воспользоваться командой
системы 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 -
операнд_целое_число:
(два операнда):
|| или
&& и
<<= меньше или равно?
>>= больше или равно?
>> больше?
<< меньше?
+ сложить
- вычесть
* умножить
/ делить
% остаток деления
(один операнд):
++ инкремент,
(постфиксная)
-- декремент,
(постфиксная)
поразрядные_логические:
& умножение
| сложение
^ исключающее или
~ дополнение
(унарная)
! отрицание
(унарная)
>>>> сдвиг вправо
<<<< сдвиг влево
операции опроса свойств файла:
они записываются в виде -код имя_файла, где код - одна
из следующих букв, обозначающих операцию:
r (можно ли читать?)
w (можно ли писать?)
x (можно ли выполнять?)
e (файл существует?)
o (выполняющий владелец файла?)
z (размер файла = 0 ?)
f (файл зашифрован?)
d (файл - это каталог?)
Если файл обладает требуемым свойством, то возвращается
значение истина, иначе ложь.
Строка с выражением может иметь следующие форматы:
символ @
распечатать значения всех переменных;
@ имя операция_присваивания выражение
присвоение переменной имя значения выражения;
- 31 -
@ имя[целое] операция_присваивания выражениe
присвоение значения выражения элементу массива.
Операции присваивания аналогичны подобным операциям
языка Си:
= += -= *= /= %=
Порядок выполнения операций определяется либо по умолчанию,
с учетом старшинства, либо явным указанием круглых скобок.
В показанном ниже ряду операций старшинство операций растет
слева направо:
||, &&, | , ^ , & , ==, !=,
<<=, >>=, << , >> , <<<<, >>>>, + ,
- , * , / , % , ! , ~ , ( )
Внутри указанных ниже групп операции имеют одинаковый прио-
ритет:
[ =~, !~, ==, != ]
[ <<, >>, <<=, >>= ]
[ <<<<, >>>> ]
[ +, - ]
[ *, /, % ]
Все знаки операций и знак присваивания должны отде-
ляться от операндов пробелами. Части выражений, содержащие
знаки операций, необходимо брать в круглые скобки. Перед
круглыми скобками и за ними должен идти пробел. Количество
пробелов, знаков табуляции не ограничивается, эти символы
являются только разделителями.
Ниже приведен пример командного файла, содержащего
строки с выражениями:
- 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 >> 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 ответ = $<<
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 ЭВМ = $<<
continue
case '[БбBb]':
glob 'Заводской номер ЭВМ: '
set НОМ = $<<
continue
case '[ВвWw]':
glob 'Организация: '
set ОРГ = $<<
continue
case '[ГгGg]':
glob 'Подразделение: '
set ПОД = $<<
continue
case '[1-9]':
case "1[012]":
glob $имя[$ответ]': '
- 41 -
set мес[$ответ] = $<<
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 ответ = "$<<"
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 >>& 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 >>& 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 >>& 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 -
Популярность: 2, Last-modified: Mon, 29 Jun 1998 13:54:54 GmT