им переменным, объявить и присвоить значения новым. Значения стандартных переменных окружения использу- ются многими системными программами. Они доступны как конс- танты и программам пользователя. Важно отметить, что значе- ния переменных окружения являются внутренними константами интерпретатора. Перечисленные ниже имена зарезервированы как стандартные имена переменных окружения: 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 -