Разделы:

Главная

О проекте

Загрузки

Документация:

Linux

BSD

Другие Unix

Программинг

HTML, XML...

Сервера

"Окна Закрой!"

MANы

 



8. C-SHELL
Язык и интерпретатор языка C-Shell появился в версии сис- темы UNIX Калифорнийского университета в Беркли UNIX BSD4.2 для VAX-11. Основные достоинства этой версии заключаются в добавлении в UNIX редакторов ex и vi, интерпретатора C-Shell, реализации языков ПАСКАЛЬ и ЛИСП, базы данных INGRES и других возможностей.

8.1. Специальные символы в C-Shell

Стандартным знаком подсказки является процент (%). При желании его можно заменить.
Восклицательный знак ( ! ) выполняет многие специальные функции, в частности ( !! ) означает вызов предыдущей коман- ды.
Знак крышка ( ^ ) используется для разделения строк при коррекции части текста предыдущей команды.
Знак тильда ( ~ ) в качестве префикса имени пользователя расширяет его до полного имени его рабочего каталога.
Фигурные скобки ({ }) группируют список имен файлов в группу имен файлов.

8.2. Стандартные файлы в C-Shell

Когда вы входите в C-Shell, он ищет в вашем рабочем ката- логе файлы .login и .cshrc. Если такие файлы у вас есть, он выполняет все команды, расположенные в них. Файл .login ис- пользуется только при входе в C-Shell с терминала; .cshrc - при любом входе.

8.3. Механизм истории

Встроенный механизм истории интерпретатора C-Shell хранит заданное число последних введенных вами команд. Число храни- мых команд равно значению предопределенной переменной history, которую вы можете установить в файле .cshrc коман- дой set:
% set history = 15
(в отличие от Shell при установке переменной требуется слово set).
Чтобы посмотреть хранимые команды, надо распечатать на экране буфер механизма истории командой history, например: % history
1 ls -l
2 mail
3 history
%
Механизм истории обеспечивает возможность вызвать любую из хранимых команд, печатая восклицательный знак и номер ко- манды, например:
% ! 1
ls -l
. . . .
%

8.4. Коррекция предыдущей команды

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

Для коррекции непосредственно предыдущей команды есть следующие средства редактирования. Пример:

% cd /users/peter/shels
/users/peter/shels: No such file or directory.
Допущена ошибка: shels вместо shells. Она исправляется следующим образом:
%^shels^shells^
cd/users/peter/shells
%
Исправленная команда заносится в буфер истории: % history
1 ls -l
2 mail
3 history
4 cd /users/peter/shels
5 cd /users/peter/shells
6 history
Чтобы редактировать произвольную предыдущую команду, мож- но воспользоваться командой s (substitution) подстановки (см. раздел 8.6).

8.5. Повторное исполнение предыдущих команд

Исполнение предыдущих команд, сохраненных в буфере исто- рии, без повторного их набора можно осуществить различными способами.
Первый способ: напечатать восклицательный знак и имя ко- манды. Исполняется самая последняя команда из буфера истории с этим именем. Например:
   % !cd
   cd /users/peter/shells.

Необязательно печатать полное имя. Достаточно минимально- го количества символов начала имени, необходимого для одноз- начного его опознания в буфере истории, например:
% !c
cd /users/peter/shells.
Второй способ: напечатать и номер команды в буфере исто- рии без пробела между ними. Например:
   % !1
   ls -l
   <вывод команды ls -l>
   %

Наконец, имеется возможность использования последнего слова непосредственно предыдущей команды вводом двух зна- ков !$, например:
   % mv /users/wowa/spasewar.c space.c
   % pr  !$ | lpr
     pr  space.c | lpr
   %


8.6. Изменение и повторное исполнение предыдущих команд
Для исполнения частично измененных предыдущих команд ис- пользуется средство подстановки :s (substitution) части текста (похожее на аналогичное средство в редакторе ex). Пусть имеется следующий буфер истории:
% history
1 ls -l
2 mail
3 cd /users/peter/shels
4 cd /users/peter/shells
5 history
6 cd /users/peter/shells
7 ls -l
8 mv /users/wowa/spacewar.c space.c
9 pr space.c | lpr
10 history
Используем средство подстановки для изменения и испол- нения команды mv:
% !8 : s /spacewar/empire/
mv /users/wowa/empire.c space.c.

8.7. Ссылка на рабочий каталог пользователя

Знак тильда (~) используется в C-Shell для ссылки на собственный рабочий каталог или рабочий каталог другого пользователя, указанного именем пользователя.
Примеры:

% cd progs % mv ~/test.c Последняя точка означает текущий каталог progs. Чтобы уз- нать, что же в действительности выполнено, посмотрим буфер истории: % !h . . . . . . . . . . . . . . 11 mv /users/wowa/empire.c space.c 12 cd progs 12 mv /users/peter/test.c .

Пусть имеется пользователь с именем nick. Чтобы узнать его рабочий каталог, можно использовать команду echo и средство знака тильда: % echo ~nick
/users/nick
%

8.8. Использование групп имен файлов

Кроме средств метасимволов для ссылки на множество файлов в C-Shell применяется средство группирования имен файлов для явного указания множества файлов в виде спискф имен файлов, заключенного в фигурные скобки. Пример:

   % cp /users/peter/animals/{cats, dogs, birds}
Или: % cp ~mary/animals/{cats, dogs, birds}.
   Эта команда копирует множество из трех файлов с именами:
   /users/peter/animals/cats
   /users/peter/animals/dogs
   /users/peter/animals/birds

В одной команде можно использовать более одной группы файлов, например:
% echo ls{/bin, /usr/ucb}{pi, is}
ls /bin/pi /bin/is /usr/ucb/pi /usr/ucb/is

8.9. Механизм переименования

Этот механизм, называемый alias, позволяет дать дополни- тельные (обычно короткие) имена часто используемым (обычно
длинным) командам.
Пример:
   % alias cdm1 cd /users/sys/doce/mans/man/man1
   % alias cdm2 cd /users/sys/doce/mans/man/man2
   % alias cdm3 cd /users/sys/doce/mans/man/man3

Чтобы изменить текущий каталог, например, на ...man 2, достаточно ввести соответствующую команду по ее дополнитель- ному имени:
% cdm2
% pwd
/users/sys/doce/mans/man/man2.
Те же переименования можно выполнить короче с использова- нием ссылки !$ на последнее слово команды:
% alias cdm cd /users/sys/docs/mans/man/man \!$
% cdm 3
% pwd
/ users/sys/docs/mans/man3.
Обратный слэш перед восклицательным знаком исключает действие восклицательного знака как специального символа. Отмена переименования производится командой unalias, нап- ример:
   % unalias  cdm.


8.10. Переменные в C-Shell

Подобно языку Shell, C-Shell имеет встроенные переменные, установка которых может влиять на поведение интерпретатора. Установка значения переменной производится командой set, имеющей следующий синтаксис:

set <переменная> = <значение> Рассмотрим наиболее употребительные встроенные перемен- ные.
Переменная history задает количество предыдущих команд, сохраняемых в буфере истории, например: set history = 30. Переменная path устанавливает каталоги для поиска команд. Список каталогов, разделенных пробелами, заключается в скоб- ки:
set path = (/bin /usr/ucb $Home/bin .)
Переменная prompt задает строку подсказки перед выполне- нием очередной команды. При этом символы \ ! (обратный слэш и восклицательный знак) в строке подсказки задают текущий номер команды, используемый в механизме истории. Пример:
   % set prompt =  "ed \ ! >"
   ed5> history
   . . . . . . . .
   5 history

Переменная Shell указывает, какой интерпретатор вы хотите в качестве начального. Возможные значения: /bin/csh или /bin/sh.
Булевская переменная noclobber используется для защиты уже существующего файла от случайной потери путем перезаписи в него при перенаправлении стандартного вывода. Для этого ее надо установить в значение "истина":
% set noclobber
% fgrep ounds /usr/dict/words > shells
Shells: File exists -
(файл с именем shells уже существует и его текущая версия была бы потеряна). Если вы тем не менее хотите перезаписать этот файл, используйте перенаправление с восклицательным знаком (>!):
% fgrep ounds /usr/dict/words >! shells
В этом случае перезапись состоится. Установка булевской переменной в противоположное значение "ложь" выполняется ко- мандой:
unset noclobber.
Переменные home и cwd, устанавливаемые автоматически, равны полным именам собственного и текущего каталогов соот- ветственно.
Переменная status автоматически возвращает нулевое значе- ние, если текущая команда завершена без ошибок. Ненулевое значение указывает ошибочное завершение. Переменная argv содержит аргументы командной строки с ну- мерацией аргументов следующим образом: argv [0] - команда, argv [1] - первый аргумент и так далее (как в языке C). Доступ к переменным обеспечивается ссылкой на имена с предшествующим знаком $, например, $cwd, $argv [0] и т.д. Посмотреть текущие значения встроенных переменных можно командой set без параметров:
% set
Пользователь может определить свои переменные типа строка знаков. Например:
   % set wd = `pwd`
   % echo $wd
   /users/sys/docs.
Здесь результат выполнения команды pwd (строка полного имени рабочего каталога пользователя) присвоен переменной wd, значение которой проверено командой echo. Кроме строковых переменных можно определить числовые пе- ременные, принимающие значения типа целое, вещественное или булевское. Целое и вещественное значение начинающееся с ну- ля, считается восьмеричным, иначе - десятичным. Установка значения числовой переменной выполняется командой @ (аналог set для строковых переменных).
Пример:
   % @ sum = (1 + 4)
   % echo $sum
   5
   В общем случае синтаксис команды @ такой:
   @ <переменная>  ,
   где C-операция - один из операторов присваивания,  приня-
тых в языке C (=, +=, -=, *=, /=, %=), а C-выражение - выра-
жение в синтаксисе языка C.


8.11. Метасимволы в C-Shell

Метасимволами называются символы, имеющие специальное значение для интерпретатора.
В C-Shell имеются следующие метасимволы:
- синтаксические;
- именования файлов;
- кавычки;
- ввода - вывода;
- подстановки;
- прочие.
Многие из них сходны по функциям с аналогичными функциями метасимволов обычного Shell.
Синтаксические метасимволы:
; - разделяет команды, которые будут выполнены последова- тельно;
Ё - разделяет команды, соединенные каналом, так что стан- дартный вывод левой является стандартным вводом правой;
Ё& - аналогично Ё, однако диагностический вывод тоже нап- равляется на ввод следующей команды;
( ) - объединяют команды, разделенные предыдущими знака- ми, в единое целое для использования в последовательности или с каналом;
& - предписывает выполнение команды на заднем плане па- раллельно со следующей командой, например:
   cat  letter>/dev/lp &

ЁЁ - аналогичен знаку Ё, однако правая команда выполняет- ся, только если левая завершилась аварийно;
&& - аналогичен знаку Ё, однако правая выполняется, толь- ко если левая завершилась нормально.
Метасимволы именования файлов:
? - любой символ в имени файла. Например, файлы fa.o, fb.o, fc.o могут быть напечатаны одной командой:
$ cat f?.o > total.o
* - любая строка в имени файла. Например, удаление всех файлов, имена которых начинаются с old:
% rm old*
[] - любая одна буква из указанного в квадратных скобках диапазона. Например:
% ls f.[a - z] - печать всех файлов типа f.x, где x - буква из диапазона a - z;
{} - аналогичны квадратным скобкам [], однако вместо диа- пазона указано множество букв. Например, печать файлов list, last, lost:
% ls l{iao}st;
~ - полное имя рабочего каталога пользователя (см.выше);
/ - разделяет имена каталогов и файла в полном имени файла или каталога.

Метасимволы - кавычки:
\ - отменяет мета-значение следующего за ним одного мета- символа. Например:
% ls \*
* not found
(в то время как % ls * - печать всех файлов текущего ка- талога)
' ' - отменяет мета-значения группы символов. Пример:
% set string = 'ws - l $dir / $file'
" " - аналогичны одиночным кавычкам, однако подстановка значений переменных и команд выполняется. Пример:
% echo "$dir is not a directory."
Метасимволы ввода - вывода:
< - перенаправление ввода;
> - перенаправление вывода (если переменная noclobber ус- тановлена, перезапись существующего файла вывода не происхо- дит);
>& - перенаправление диагностического вывода;
>! - перенаправление вывода (с обязательной перезаписью существующего файла вывода);
>&! - аналогично >! для диагностического вывода;
>> - аналогично >, однако вывод добавляется в конец су- ществующего файла вывода; если файл не существует и перемен- ная noclobber установлена, возникает ошибка;
>>& - аналогично >&, однако вывод добавляется в конец файла вывода;
>>! - аналогично >>, однако, если файл вывода не сущест- вует, он создается (ошибки не возникает);
>>&! - комбинация >>& и >>!
Метасимволы подстановки:
$ - указывает подстановку значения переменной, например: % set M1 = /usr/man/man3
% cd $M1
! - указывает подстановку команды из буфера истории;
: - указывает подстановку строк в команде из буфера исто- рии;
? - используется в специальных случаях подстановок команд из буфера истории.

Прочие метасимволы:
# (диез) - указывает комментарий C-Shell; начинает имена временных файлов; должен быть первым символом командного файла в C-Shell;
% - указывает номер процесса, например: kill %1.

8.12. Некоторые команды C-Shell

В добавление к командам языка Shell в C-Shell появился ряд полезных команд. Рассмотрим некоторые из них.
Команда ls с ключом -F позволяет получить листинг катало- га с указанием знаком * исполнимых файлов и знаком / катало- гов.
Пример:
% ls -F
mail help lint1* tabset/
Команда head, симметричная команде tail, позволяет пос- мотреть на экране заданное количество первых строк файла (по умолчанию 10 строк), например:
   % head -2 people
   Mary  Clark  101
   Sally Smith  113
Листание файла на экране позволяет осуществить команда more, например:
% more somefile
<первая страница фала>
- - More - - (3 %)
%
Процент в скобках указывает уже просмотренную часть фай- ла. Для последовательного постраничного просмотра нажмите клавишу пробела, для построчного - клавишу возврата каретки. Можно задать начало просмотра со строки с заданным номе- ром или заданным значением. Примеры:
% more +194 somefile
. . . . .
% more +'more then' somefile В общем случае значение задается регулярным выражением, как в ed или grep (см. раздел 10.5).
Команда apropos позволяет найти разделы руководств, ка- сающиеся заданного ключевого слова.
Пример:
   % apropos sort
   ddsort (3/21/80) - sort DDBS files
   look (1)         - find lines in a sorted list
   . . . . . . . . . . . . . . .
   tsort (1)        - topological sort
   % man look
   <руководство по look (1)>
   Просмотреть заголовки руководств можно командой whatis,
   например:
   % whatis mv ln cp
   cp (1)  - copy
   ln (1)  - make links
   mv (1)  - move or rename files
   Команда whereis  позволяет найти специальные файлы,  свя-
занные с указанной командой (опция -m находит файл руководс-
тва, опция -b - файл кода команды).
   Пример:
   % wheris -m rm
   rm: /usr/man/man1/rm.1
   % wheris -b rm
   rm: /bin/rm
   Команда strings позволяет просмотреть в любом (в том чис-
ле выполнимом) файле все строки (в коде ASCII).


8.13. Оценка состояния файла

Выражение, возвращающее значение, зависящее от состояния файла, используется в условных операторах (см.ниже). Значе- ние равно единице (1), если выражение истинно, и ноль (0), если оно ложно или файл не существует. Синтаксис выражения:
-op <имя файла>,
где op принимает значения:
d - является ли файл каталогом?
e - файл существует?
f - является ли файл простым файлом?
o - это мой собственный файл?
r - имею ли я право чтения файла?
w - имею ли я право записи файла?
x - могу ли я выполнить файл?
z - файл пуст (длина ноль байтов)?
Пример:
   if (-d $dir) then
   echo "**** $dir is a directory"


8.14. Работы

Любая последовательность команд, разделенных метасимвола- ми ; или Ё, а также отдельная команда является работой. Каж- дая работа выполняется отдельным процессом.
Заканчивая такую последовательность команд или отдельную команду знаком &, можно задать выполнение работы на заднем плане, то есть параллельно с будущими работами. В этом слу- чае система сообщает вам номер работы в скобках и номер про- цесса, например:
   % du > usage &
   [1] 503
   % ls -al
   <Содержание текущего каталога>
   %.
По окончании работы система сообщает о завершении (нор- мальном или аварийном), указывая номер работы и процесса, например:
   .....
   [1] 503 - Done  du > usage
   %.
Чтобы посмотреть, какие работы активны в данный момент, используйте команду jobs -l. Эта команда распечатает список работ с указанием их сос- тояния:
Running (выполняется) или Stopped (остановлена).

8.15. Командные файлы (скрипты) в C-Shell

Командный файл (скрипт) - это файл, состоящий из команд, выполняемых группой. Примеры скриптов - файлы .login,.cshrc, .logout. Прежде чем писать свой скрипт, проверьте UNIX Reference используемой Вами версии UNIX, нет ли там команды, уже решающей вашу задачу.
Первый способ выполнения скрипта - ввести команду: % csh sname arg1 arg2 ...,
где sname - имя скрипта; arg1, arg2 ... - аргументы скрипта. Аргументы скрипта автоматически помещаются во встроенные переменные $argv[1], $argv[2] и так далее.
Кроме того, аргументы доступны по ссылкам $n, где n - це- лое, равное позиции аргумента; $0 означает sname. Различие между $argv[n] и $n заключается в том, что первая ссылка да- ет ошибку при выходе значения n за допустимые пределы, а вторая - нет.
Второй способ выполнения скрипта в C-Shell - обеспечить его выполнимость (командой chmod) и позаботиться о том, что- бы он начинался с символа #(диез); в противном случае скрипт будет выполняться обычным Shell. Пример:
% chmod a+x sname
% sname arg1, arg2, ...
При выполнеии скрипта производится подстановка значений переменных, ссылки на которые указывает знак $. Переменная должна обладать значением в момент ссылки на нее, иначе воз- никает ошибка.
Узнать, присвоено ли значение переменной, можно с помощью выражения $?<имя> (1 - присвоено, 0 - нет), а количество компонентов значения дает выражение $#<имя>.
На компоненты значения можно ссылаться выражением $<имя>[n], где n - номер компоненты. Компоненты значения разделяются пробелами, а многокомпонентное значение заключа- ется в скобки. Пример:
   % set sum1 = (a b c)
   % echo $?sum1
   1
   % echo $#sum1
   3
   % echo $sum1[2]
   b
   % unset sum1
   % echo $?sum1
   0.

Другими полезными подстановками, начинающимися знаком $, являются:
$* - эквивалентно $argv;
$$ - номер процесса; поскольку он уникален в системе, его удобно использовать для генерации уникального имени времен- ного файла;
$< - заменяется строкой последующего ввода со стандартно- го ввода (клавиатура терминала), что очень полезно при напи- сании интерактивных скриптов. Пример:
   echo "yes or no?"
   set a = ($<)
   На экране  высветится  запрос  (yes or no?),  затем будет
прочитан ответ и присвоен переменной a.


8.16. Выражение в скриптах

Допускается использование выражений над переменными по правилам операций в языке C. Например, операции '==' и '!=' сравнивают строки, операции '&' и 'Ё' реализуют булевские операции 'и' и 'или' и так далее. Введены также специальные операции '=~' и '!~', подобные операциям '==' и '!=', однако в правой строке допускаются метасимволы C-Shell (*, ? и []). Кроме того, допустимы выражения для оценки состояния фай- ла (см. раздел 8.13). Результат выполнения предыдущей команды (нормальное или аварийное завершение) можно получить в виде значения пере- менной
$status (ноль - без ошибок, не ноль - авария).

8.17. Управляющие структуры скриптов

Допустимые в C-Shell управляющие структуры взяты из языка C. Напомним, что скрипт в C-Shell должен начинаться с симво- ла #(диез). Этим же символом вводится комментарий, продолжа- ющийся до конца строки.

8.17.1. Оператор foreach

   Оператор цикла foreach имеет синтаксис:
   foreach <индекс> (<список значений индекса через пробелы>)
   <команда 1>

   <команда 2>
   ..........
   end.

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

8.17.2. Оператор if-then-endif

Условный оператор имеет синтаксис:
   if (<выражение>) then
   <команда 1>
   <команда 2>
   ..........
   else
   <команда A>
   <команда Б>
   ..........
   endif
Если альтернатива else пуста (команды А, Б, ... отсутс- твуют), else можно опустить. Реализация C-Shell требует, чтобы if и then были обязательно на одной строке. Допустимы вложенные условные операторы, например:
   if (<выражение 1>) then
   <команда 1>
   ..........
   else if (выражение 2> then
   <команда А>
   ..........
   else
   <команда X>
   ..........
   endif
   endif

Если в первой альтернативе только одна команда, допуска- ется следующий синтаксис: if (<выражение>) <команда 1> или: if (выражение>\ <команда> где символ \ должен предшествовать символу перевода ка- ретки. 8.17.3. Оператор while Оператор цикла while имеет синтаксис: while (<выражение>) <команда 1> <команда 2> .......... end. Внутри цикла допустимы операторы break и continue (см.foreach).

8.17.4. Оператор switch

Оператор выбора имеет синтаксис:
   switch (<переменная>)
   case <значение 1>:
   <команды>
   ........
   breaksw
   case <значение 2>:
   <команды>
   ........
   breaksw
   ........
   case <значение n>:
   <команды>
   ........
   breaksw
   default:
   <команды>
   ........
   breaksw
   endsw

В отличие от аналогичного оператора в языке C здесь ис- пользуется специальный оператор breaksw для выхода из аль- тернативы.
Выполнение осуществляется следующим образом: значение пе- ременной сравнивается последовательно со значениями 1, 2, ..., n, и выполняются команды первой из альтернатив, для ко- торых значения совпали. Если таких значений не оказалось, выполняются команды из альтернативы по умолчанию (default).

8.17.5. Оператор goto

Допускаются метки операторов и оператор goto. Например:
loop:
<команда 1>
<команда 2>
..........
goto loop

8.18. Ввод в командах скрипта

Обеспечение ввода в командах скрипта в C-Shell из потока символов текста скрипта вместо стандартного ввода (использу- емого по умолчанию), потребовало введения специального син- таксиса. Рассмотрим пример скрипта:
   #
   foreach i ($argv)
   ed -$i >> 'STOP'
   1, $s/wine/water/g
   w
   q
   'STOP'
   end

Строка 'STOP', появляющаяся в тексте скрипта дважды, яв- ляется меткой, ограничивающей текст ввода, и означает, что стандартный ввод для команды ed заменяется посредством меха- низма перенаправления (знак <<) вводом текста из файла само- го скрипта. Ограничитель 'STOP' заключен в кавычки, чтобы предотвратить подстановку переменных и команды внутри него. В примере редактор ed выполняет глобальную подстановку всех вхождений строки wine на строку water (см. раздел 12.4).

8.19. Обработка прерываний в скриптах

Если ваш скрипт создает временные файлы, вы можете захо- теть уничтожить их, даже если прерывание скрипта не позволит вам выполнить скрипт до конца (предполагается, что в конце скрипта временные файлы всегда уничтожаются).
Для этого вам нужно в начале скрипта выполнить команду onintr label, где label - произвольная метка, начиная с ко- торой в вашем скрипте стоят команды, которые будут выполне- ны, если произойдет прерывание (так как в случае прерывания C-Shell автоматически выполнит команду goto label, где label - метка из команды onintr).
При этом вы можете предусмотреть среди выполняемых в слу- чае прерывания команд в качестве последней команду exit 1, чтобы обеспечить ненулевое значение переменной $status, сви- детельствующей о неблагополучном завершении скрипта.

8.20. Пример скрипта

Данный скрипт выполняет сохранение файлов C-программ, ко- торые уже сохранялись ранее. Файлы сохраняются в подкаталоге backup вашего рабочего каталога.
 #
   foreach i ($argv)
   if ($i \ !~  ~/*.c)
   then # является ли файл $i файлом С-программы ?
   echo файл $i не является файлом С-программы
   continue
   else
   echo файл $i является файлом С-программы
   endif
   echo check file ~/backup/$i
   if (-e ~/backup/$i)
   then # находится ли файл $i в подкаталоге  backup?
   echo  файл $i не находится в подкаталоге  backup
   continue
   endif
   echo compare two files $i and ~/backup/$i
   cmp -s $i ~/backup/$i
   if ($status != 0) then
   echo новая копия файла $i
   cp $i ~/backup/$i
   endif
   end.

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

далее     содержание


Партнёры и спонсоры проекта:

Все материалы сайта распространяются по лицензии GNU/GPL
© ProUNIX 2003-2009, UnixLib 2005-2009, SoftLib 2006-2009.