8. C-SHELL

Язык и интерпретатор языка C-Shell появился в версии сис-

темы UNIX Калифорнийского университета в Беркли UNIX BSD4.2

для VAX-11. Основные достоинства этой версии заключаются в

добавлении в UNIX редакторов ex и vi, интерпретатора

C-Shell, реализации языков ПАСКАЛЬ и ЛИСП, базы данных

INGRES и других возможностей.

 

 

 

- 49 -

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).

 

 

- 50 -

Чтобы посмотреть хранимые команды, надо распечатать на

экране буфер механизма истории командой 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.

 

 

- 51 -

Допущена ошибка: 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.

Необязательно печатать полное имя. Достаточно минимально-

го количества символов начала имени, необходимого для одноз-

начного его опознания в буфере истории, например:

 

 

- 52 -

% !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

 

 

- 53 -

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 .

 

 

- 54 -

Пусть имеется пользователь с именем 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, позволяет дать дополни-

тельные (обычно короткие) имена часто используемым (обычно

 

 

- 55 -

длинным) командам.

Пример:

% 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,

имеющей следующий синтаксис:

 

 

 

- 56 -

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 используется для защиты

уже существующего файла от случайной потери путем перезаписи

в него при перенаправлении стандартного вывода. Для этого ее

надо установить в значение "истина":

 

 

 

- 57 -

% 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 без параметров:

 

 

- 58 -

% set

Пользователь может определить свои переменные типа строка

знаков. Например:

% set wd = `pwd`

% echo $wd

/users/sys/docs.

Здесь результат выполнения команды pwd (строка полного

имени рабочего каталога пользователя) присвоен переменной

wd, значение которой проверено командой echo.

Кроме строковых переменных можно определить числовые пе-

ременные, принимающие значения типа целое, вещественное или

булевское. Целое и вещественное значение начинающееся с ну-

ля, считается восьмеричным, иначе - десятичным. Установка

значения числовой переменной выполняется командой @ (аналог

set для строковых переменных).

Пример:

% @ sum = (1 + 4)

% echo $sum

5

В общем случае синтаксис команды @ такой:

@ <переменная> <C-операция> <C-выражение>,

где C-операция - один из операторов присваивания, приня-

тых в языке C (=, +=, -=, *=, /=, %=), а C-выражение - выра-

жение в синтаксисе языка C.

 

 

 

- 59 -

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

Метасимволами называются символы, имеющие специальное

значение для интерпретатора.

В C-Shell имеются следующие метасимволы:

- синтаксические;

- именования файлов;

- кавычки;

- ввода - вывода;

- подстановки;

- прочие.

Многие из них сходны по функциям с аналогичными функциями

метасимволов обычного Shell.

 

Синтаксические метасимволы:

; - разделяет команды, которые будут выполнены последова-

тельно;

│ - разделяет команды, соединенные каналом, так что стан-

дартный вывод левой является стандартным вводом правой;

│& - аналогично │, однако диагностический вывод тоже нап-

равляется на ввод следующей команды;

( ) - объединяют команды, разделенные предыдущими знака-

ми, в единое целое для использования в последовательности

или с каналом;

& - предписывает выполнение команды на заднем плане па-

раллельно со следующей командой, например:

cat letter>/dev/lp &

 

 

- 60 -

││ - аналогичен знаку │, однако правая команда выполняет-

ся, только если левая завершилась аварийно;

&& - аналогичен знаку │, однако правая выполняется, толь-

ко если левая завершилась нормально.

 

Метасимволы именования файлов:

? - любой символ в имени файла. Например, файлы 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;

~ - полное имя рабочего каталога пользователя (см.выше);

/ - разделяет имена каталогов и файла в полном имени

файла или каталога.

 

 

- 61 -

Метасимволы - кавычки:

\ - отменяет мета-значение следующего за ним одного мета-

символа. Например:

% ls \*

* not found

(в то время как % ls * - печать всех файлов текущего ка-

талога)

' ' - отменяет мета-значения группы символов. Пример:

% set string = 'ws - l $dir / $file'

" " - аналогичны одиночным кавычкам, однако подстановка

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

% echo "$dir is not a directory."

 

Метасимволы ввода - вывода:

< - перенаправление ввода;

> - перенаправление вывода (если переменная noclobber ус-

тановлена, перезапись существующего файла вывода не происхо-

дит);

>& - перенаправление диагностического вывода;

>! - перенаправление вывода (с обязательной перезаписью

существующего файла вывода);

>&! - аналогично >! для диагностического вывода;

>> - аналогично >, однако вывод добавляется в конец су-

ществующего файла вывода; если файл не существует и перемен-

ная noclobber установлена, возникает ошибка;

>>& - аналогично >&, однако вывод добавляется в конец

файла вывода;

>>! - аналогично >>, однако, если файл вывода не сущест-

вует, он создается (ошибки не возникает);

 

 

- 62 -

>>&! - комбинация >>& и >>!

 

Метасимволы подстановки:

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

% set M1 = /usr/man/man3

% cd $M1

! - указывает подстановку команды из буфера истории;

: - указывает подстановку строк в команде из буфера исто-

рии;

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

из буфера истории.

 

Прочие метасимволы:

# (диез) - указывает комментарий C-Shell; начинает имена

временных файлов; должен быть первым символом командного

файла в C-Shell;

% - указывает номер процесса, например:

kill %1.

 

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

В добавление к командам языка Shell в C-Shell появился

ряд полезных команд. Рассмотрим некоторые из них.

Команда ls с ключом -F позволяет получить листинг катало-

га с указанием знаком * исполнимых файлов и знаком / катало-

гов.

Пример:

 

 

- 63 -

% 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 позволяет найти разделы руководств, ка-

сающиеся заданного ключевого слова.

 

 

- 64 -

Пример:

% 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).

 

 

 

- 65 -

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. Работы

Любая последовательность команд, разделенных метасимвола-

ми ; или │, а также отдельная команда является работой. Каж-

дая работа выполняется отдельным процессом.

Заканчивая такую последовательность команд или отдельную

команду знаком &, можно задать выполнение работы на заднем

 

 

- 66 -

плане, то есть параллельно с будущими работами. В этом слу-

чае система сообщает вам номер работы в скобках и номер про-

цесса, например:

% 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, нет ли там команды,

уже решающей вашу задачу.

 

 

 

- 67 -

Первый способ выполнения скрипта - ввести команду:

% 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 - номер компоненты. Компоненты значения

 

 

- 68 -

разделяются пробелами, а многокомпонентное значение заключа-

ется в скобки.

Пример:

% 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.

 

 

- 69 -

 

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

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

правилам операций в языке C. Например, операции '==' и '!='

сравнивают строки, операции '&' и '│' реализуют булевские

операции 'и' и 'или' и так далее. Введены также специальные

операции '=~' и '!~', подобные операциям '==' и '!=', однако

в правой строке допускаются метасимволы C-Shell (*, ? и []).

Кроме того, допустимы выражения для оценки состояния фай-

ла (см. раздел 8.13).

Результат выполнения предыдущей команды (нормальное или

аварийное завершение) можно получить в виде значения пере-

менной

$status (ноль - без ошибок, не ноль - авария).

 

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

Допустимые в C-Shell управляющие структуры взяты из языка

C. Напомним, что скрипт в C-Shell должен начинаться с симво-

ла #(диез). Этим же символом вводится комментарий, продолжа-

ющийся до конца строки.

 

8.17.1. Оператор foreach

Оператор цикла foreach имеет синтаксис:

foreach <индекс> (<список значений индекса через пробелы>)

<команда 1>

 

 

- 70 -

<команда 2>

..........

end.

Все команды выполняются для каждого значения индекса из

списка значений.

Внутри цикла можно использовать команду break для прекра-

щения выполнения цикла и команду continue для преждевремен-

ного прекращения одной текущей итерации.

При выходе из цикла индекс имеет значение последнего эле-

мента из списка значений.

 

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

Условный оператор имеет синтаксис:

if (<выражение>) then

<команда 1>

<команда 2>

..........

else

<команда A>

<команда Б>

..........

endif

Если альтернатива else пуста (команды А, Б, ... отсутс-

твуют), else можно опустить. Реализация C-Shell требует,

чтобы if и then были обязательно на одной строке.

 

 

 

- 71 -

Допустимы вложенные условные операторы, например:

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).

 

 

- 72 -

 

8.17.4. Оператор switch

Оператор выбора имеет синтаксис:

switch (<переменная>)

case <значение 1>:

<команды>

........

breaksw

case <значение 2>:

<команды>

........

breaksw

........

case <значение n>:

<команды>

........

breaksw

default:

<команды>

........

breaksw

endsw

В отличие от аналогичного оператора в языке C здесь ис-

пользуется специальный оператор breaksw для выхода из аль-

тернативы.

 

 

- 73 -

Выполнение осуществляется следующим образом: значение пе-

ременной сравнивается последовательно со значениями 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

 

 

- 74 -

'STOP'

end

Строка 'STOP', появляющаяся в тексте скрипта дважды, яв-

ляется меткой, ограничивающей текст ввода, и означает, что

стандартный ввод для команды ed заменяется посредством меха-

низма перенаправления (знак <<) вводом текста из файла само-

го скрипта. Ограничитель 'STOP' заключен в кавычки, чтобы

предотвратить подстановку переменных и команды внутри него.

В примере редактор ed выполняет глобальную подстановку всех

вхождений строки wine на строку water (см. раздел 12.4).

 

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

Если ваш скрипт создает временные файлы, вы можете захо-

теть уничтожить их, даже если прерывание скрипта не позволит

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

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

Для этого вам нужно в начале скрипта выполнить команду

onintr label, где label - произвольная метка, начиная с ко-

торой в вашем скрипте стоят команды, которые будут выполне-

ны, если произойдет прерывание (так как в случае прерывания

C-Shell автоматически выполнит команду goto label, где label

- метка из команды onintr).

 

 

- 75 -

При этом вы можете предусмотреть среди выполняемых в слу-

чае прерывания команд в качестве последней команду 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


 

- 76 -

   if ($status != 0) then
   echo новая копия файла $i
   cp $i ~/backup/$i
   endif
   end.

Собственно копирование делается командой cp, а все ос-

тальные строчки скрипта организуют цикл и осуществляют про-

верки.