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

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

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

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


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


- 14 -










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

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

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

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

stty tostop

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

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

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

fg %1
или
fg %cat

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

stty -tostop


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

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

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

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




- 15 -










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


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

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

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

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


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

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

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

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

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

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


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






- 16 -










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

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

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


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

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

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

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

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

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

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

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


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




- 17 -










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

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

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

ls -l ~

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

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

% ls ~Иванов

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

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

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


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

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

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


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


- 18 -










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

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

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


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

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

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

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

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

set nonomatch; echo f.[4-9]

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

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

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

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


- 19 -










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

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


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


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


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

comfile aaa bbb ccc ddd

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

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

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

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

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







- 20 -










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


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

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

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

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

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

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

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


- 21 -










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

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

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

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

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

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

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

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

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

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

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

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

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


- 22 -










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















































- 23 -










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



- 24 -










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

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

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

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

















- 25 -










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

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

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


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

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

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

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

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

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

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



- 26 -










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

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

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

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

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

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

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


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

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


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





















- 27 -










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

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

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

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

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

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

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


- 28 -










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

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


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






- 29 -










1.8. Выражения

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

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


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

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

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

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

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

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
















- 30 -










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


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

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

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

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

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

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


- 31 -










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


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

= += -= *= /= %=

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

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

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

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

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

[ =~, !~, ==, != ]
[ <&lt;, >&gt;, <&lt;=, >&gt;= ]
[ <&lt;<&lt;, >&gt;>&gt; ]