WWW.DISUS.RU

БЕСПЛАТНАЯ НАУЧНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА - Авторефераты, диссертации, методички

 

Pages:     || 2 |

«А. В. Бородин, А. В. Бородина ОПЕРАЦИОННЫЕ СРЕДЫ, СИСТЕМЫ И ОБОЛОЧКИ Базовый курс Учебное пособие Петрозаводск Издательство ПетрГУ 2011 Печатается по решению редакционно-издательского совета Петрозаводского ...»

-- [ Страница 1 ] --

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего профессионального образования

ПЕТРОЗАВОДСКИЙ ГОСУДАРСТВЕННЫЙ

УНИВЕРСИТЕТ

А. В. Бородин, А. В. Бородина

ОПЕРАЦИОННЫЕ СРЕДЫ,

СИСТЕМЫ И ОБОЛОЧКИ

Базовый курс Учебное пособие Петрозаводск Издательство ПетрГУ 2011 Печатается по решению редакционно-издательского совета Петрозаводского государственного университета Р е ц е н з е н т ы:

канд. физ.-матем. наук Ю. В. Чуйко;

канд. физ.-матем. наук, доцент Р. В. Воронов Бородин, А. В., Бородина, А. В.

Операционные среды, системы и оболочки. Базовый курс: учебное пособие / А. В. Бородин, А. В. Бородина. – Петрозаводск : Изд-во ПетрГУ, 2011. – 104 c.

Учебное пособие предназначено для студентов математического факультета первого курса специальностей Прикладная математика, Информационные системы и технологии, Бизнес информатика, изучающих курс Операционные среды, системы и оболочки.

Содержание Введение § 1. Командный интерпретатор 1.1. Что такое shell?....................... 1.2. Зачем shell программисту?................. 1.3. Режимы работы командного интерпретатора shell... 1.3.1. Интерактивный режим............... 1.3.2. Пакетный режим.................. 1.4. Набор команд начинающего пользователя........ 1.5. Удаленный доступ к учебному серверу kappa...... § 2. Простая команда shell 2.1. Встроенные и внешние команды............. 2.2. Псевдонимы......................... 2.3. Код возврата......................... § 3. Cостав командной строки 3.1. Метасимволы......................... 3.1.1. Метасимволы языка shell.............. 3.1.2. Метасимволы в шаблонах имен файлов..... 3.2. Средства экранирования.................. 3.2.1. Эскейп-экранирование............... 3.2.2. Экранирование кавычками............. 3.2.3. Экранирование в стиле ANSI-C.......... 3.3. Подстановка команды.................... 3.4. Средства перенаправления................. § 4. Алгоритм разбора командной строки 4.1. Алгоритм поиска команды для исполнения....... § 5. Структура сложной командной строки 5.1. Конвейер........................... 5.2. Списки команд........................ 5.3. Группировка команд.................... Содержание § 6. Управление файлами и процессами 6.1. Двухуровневая архитектура ОС Linux.......... 6.2. Управление файлами.................... 6.2.1. Файл и inode..................... 6.2.2. Типы файлов.................... 6.2.3. Символические ссылки............... 6.2.4. Права доступа к файлу............... 6.2.5. Файловая система.................. 6.3. Управление процессами................... 6.3.1. Иерархия процессов................. 6.3.2. Сигналы....................... 6.3.3. Терминальные задачи................ 8.1.5. Практические примеры регулярных выражений Введение Владение средствами операционной системы и командным интерпретатором является необходимой компетенцией специалиста в области информационных технологий, в первую очередь - специалиста в области разработки программного обеспечения.

Материалы пособия используются в Петрозаводском государственном университете на математическом факультете в следующих курсах:

• Операционные оболочки в рамках дисциплины Информатика для студентов I курса направления Прикладная математика и информатика и специальности Информационные системы и технологии (с 2005 г.);

• Операционные оболочки в рамках дисциплины Операционные системы, среды и оболочки для студентов II курса очного направления Бизнес-информатика (с 2007 г.).

Изначально курс базировался на материалах учебного пособия, подготовленного Ю. А. Богоявленским, О. Ю. Богоявленской и Г. С. Сиговцевым [4], представляющего вводный пользовательский курс по работе в ОС Unix System V. Затем А. В. Бородиным и А. В. Бородиной был разработан дистанционный курс в системе WebCT Командный интепретатор Bourne Shell. Сейчас курс является необходимым связующим звеном между различными дисциплинами, в частности: Информатика, Архитектура ЭВМ, Операционные системы, Системное программирование.

С переходом на ОС Linux основным предметом изучения в курсе Операционные оболочки стал интерпретатор Bourne again shell (bash). Значительное развитие средств командного языка и изменение состава стандартного набора утилит обусловили появление настоящего пособия.

Данное издание представляет вводный курс по работе с командным интерпретатором bash в ОС Linux и предполагает освоение рабочей среды на уровне опытного пользователя.

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





§ 1. Командный интерпретатор В данном параграфе речь пойдет о выборе и использовании командного языка (или, иначе, языка оболочки операционной системы) как базового языка, обеспечивающего взаимодействие между пользователем (программистом) и операционной системой. Приведем определения, ставшие уже классическими.

Определение 1.1. Оболочка операционной системы (от англ. shell оболочка) это интерпретатор команд операционной системы (ОС), обеспечивающий интерфейс для взаимодействия пользователя с функциями системы.

Определение 1.2. Пользовательский интерфейс это аппаратнопрограммные средства, обеспечивающие взаимодействие пользователя с элементами системы компьютера.

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

с командным интерфейсом (сокр. от Command Line Interface);

CLI c графическим интерфейсом (сокр. от Graphical User Interface)1.

GUI В контексте рассматриваемой темы нас больше интересует командный CLI-интерфейс. За реализацию командного интерфейса в ОС отвечает командный интерпретатор, который представляет собой самостоятельный язык программирования с собственными функциональными возможностями и достаточно простым синтаксисом. Например, в ОС MS-DOS и ОС Windows 9x в качестве командного интерпретатора используется command.com, в ОС Windows NT интерпретатор cmd.exe.

В ОС типа UNIX/Linux используется командный интерпретатор shell, а точнее, его разновидности. Рассмотрим некоторые из них:

• sh Bourne shell2, самая первая командная оболочка ОС UNIX, распространялась платно;

Об истории развития графических интерфейсов см. в [13].

Разработана Стивеном Борном для компании AT&T.

• ksh оболочка Korn shell3, совместимая c sh, распространялась • bash оболочка Bourne again shell4, самая популярная на данный момент для ОС Linux, является модернизированной версией оболочки sh, распространяется свободно;

• zsh Z shell5, современная оболочка для ОС Unix, совместимая с sh, не входит в проект GNU, но распространяется свободно;

• csh оболочка C shell6, встроенный язык которой имеет синтаксис языка Си.

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

1) Почему именно Linux?

2) Почему именно bash?

Почему именно Linux? ОС Linux является свободнораспространяемым программным обеспечением (ПО), разработанным в рамках проекта GNU (сокр. от GNU is Not Unix ), и в последние годы приобретает все большую популярность. Проект GNU занимается разработкой и распространением свободного программного обеспечения [19].

Первыми разработками проекта GNU были программы, совместимые с ОС UNIX7. Более подробно об идеях свободно-распространяемых программ можно прочитать в книге создателя проекта GNU Ричарда Столлмана [12].

Ввиду популярности и доступности программ проекта GNU, большинство учебных курсов ПетрГУ для программистов ориентированы на использование ОС Linux. Выбирая ОС Linux, мы также выбираем и пакет совместимых программ и утилит GNU: компиляторы, отладчики, редакторы, Web-сервер, сервер баз данных и т. д.

Разработана Дэвидом Корном для лаборатории AT&T.

Разработана Брайаном Фоксом для проекта GNU.

Разработана Паулем Фалстадом, развивается под руководством Петера Стефенсона.

Разработана в Университете Беркли для проекта BSD Unix.

ОС, разработанная команией AT&T, распространяемая платно.

Почему именно bash? Для обеспечения переносимости и совместимости различных приложений существуют стандарты, в рамках которых разрабатывается программное обеспечение. Стандарт POSIX описывает множество базовых системных сервисов, необходимых для функционирования прикладных программ [3]. Он состоит из нескольких частей. Часть 3 содержит описание интерфейса системных сервисов на уровне командного языка и служебных программ и обозначена POSIX.2 в соответствии с нумерацией документов IEEE и ISO/IEC [18]. Стандарт POSIX.2 описывает так называемый POSIX shell.

Командный язык bash соответствует стандарту POSIX.2, следовательно, с помощью bash можно создавать POSIX-приложения, которые являются мобильными и легко переносимыми.

Считается, что основой стандартного интерпретатора POSIX shell был ksh, который не являлся свободнораспространяемым продуктом и, следовательно, не мог использоваться в ОС Linux (хотя свободная реализация pdksh оболочки ksh существует).

Cреди всех разновидностей командных интерпретаторов shell для ОС Linux, bash выбран в качестве стандартной оболочки и используется по умолчанию [17]. Сам по себе интерпретатор bash это достаточно мощная оболочка, объединяющая в себе функции ksh и csh, поддерживающая больше возможностей, чем предполагается стандартом POSIX. Однако bash способен эмулировать стандартный POSIX shell, что, собственно, и происходит при запуске оболочки ОС Linux. А именно: файл, который запускает POSIX shell в ОС Linux (чаще всего это /bin/sh), является ссылкой на реальный bash (/bin/bash). В этом случае bash запускается в режиме эмуляции стандартного POSIX shell, теряя при этом некоторые свои функции.

Внимание! Далее слова shell и bash будем считать синонимами.

1.1. Что такое shell?

Соберем воедино все вышесказанное. Итак, само понятие shell включает в себя несколько интепретаций.

Во-первых, shell это макропроцессор для исполнения команд.

Напомним определение [1].

Определение 1.3. Макропроцессор это программа, выполняющая преобразование входного текста в выходной путем замены последовательностей символов по правилам макроподстановки.

Чаще всего в качестве правила макроподстановки используется замена определенной строки (макрокоманды) другой строкой, возможно, с использованием параметров. Правила макроподстановки могут включать также определение процедур и функций, вычислительные алгоритмы и т. д.

Во-вторых, shell это командный интерпретатор, с помощью которого можно вызывать команды оболочки ОС и, тем самым, взаимодействовать с богатым набором утилит GNU и встроенных команд.

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

1.2. Зачем shell программисту?

Для ответа на вопрос давайте разберемся в сути отношений между командной оболочкой shell и разными категориями пользователей.

Для обычного пользователя. Основное назначение интерпретатора командной строки это обеспечение взаимодействия пользователя и системы. Другими словами shell основной инструмент для решения пользовательских задач, например, таких как запуск пользовательских приложений; создание, удаление файлов и каталогов;

редактирование текстовых документов; обеспечение доступа к внешним носителям и т. д.

Необходимо отметить, что в операционных системах семейства UNIX/Linux язык командной оболочки используется гораздо чаще, чем привыкли пользователи, например, операционной системы Windows, где доминируют приложения с графическим интерфейсом так сложилось исторически.

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

(более подробно см. в работе [2]). Справедливости ради отметим, что в ОС Linux для администрирования имеются достаточно популярные утилиты с графическим интерфейсом (например, YaST в openSUSE), избавляющие администратора от взаимодействия с командной оболочкой напрямую.

Для программиста. В функции программиста входит создание средств для решения задач как простого пользователя, так и администратора системы. Поэтому написание программ в той или иной операционной системе требует от программиста знания не только особенностей функционирования системы, но и, в первую очередь, командного языка как основного инструмента. Язык shell входит в базовый инструментарий программиста в ОС Linux и хорош для написания небольших приложений или решения отдельных подзадач.

Согласно [7] shell нецелесообразно использовать, например, в следующих случаях:

• для ресурсоемких задач (поиск, сортировка и т. д.);

• для выполнения математических вычислений с повышенной точностью;

• для создания кроссплатформенных приложений;

• для сложноструктурированных приложений (включающих, например, контроль за типами переменных, прототипы функций • для обеспечения целостности системы и защиты ее от взлома;

• для задач, выполняющих огромный объем работ с файлами или многомерными массивами;

• для GUI-приложений;

• для прямого доступа к аппаратуре компьютера.

1.3. Режимы работы командного интерпретатора Командный интерпретатор shell может работать в двух режимах:

интерактивном и пакетном.

1.3.1. Интерактивный режим Интерактивный режим подразумевает диалог shell и пользователя, примерно следующий:

Пример 1. shell: приглашение user: команда shell: приглашение user: команда shell: приглашение Последнее слово (приглашение) всегда остается за shell. Примером работы в интерактивном режиме является процесс авторизации пользователя в системе, т. к. при входе пользователя в систему запускается экземпляр оболочки shell (т. н. login shell). Опишем основные этапы диалога более подробно.

Этап 1: приглашение. После запуска экземпляра командного интерпретатора shell выводит на экран приглашение командной это является началом диалога. Приглашение командной строки строки может выглядеть, например, так:

Пример 1. # 1: Для домашнего каталога пользователя pupkin pupkin@kappa:~> # 2: Для домашнего каталога пользователя pupkin pupkin@kappa:/home/pupkin> # 3: Вид приглашения для главного каталога pupkin@kappa:/> Можно заметить, что строка-приглашение содержит информацию об имени пользователя (pupkin), имени сервера (kappa) и текущем каталоге, в котором в данный момент находится пользователь. Для случаев 1 и 2 из примера 1.2 текущий каталог один и тот же: /home/pupkin, он является домашним для пользователя pupkin и имеет специальное обозначение (тильда). В случае 3 текущим является главный каталог c именем /. Подробнее об иерархии каталогов см. в § 6.

На самом деле, вид приглашения командной строки можно настраивать по собственному желанию (изменив значение переменных окружения PS1 и PS2). Подробнее о переменных окружения см. в § 7.

Этап 2: команда. Пользователь вводит команду, интерпретатор выполняет. Как происходит запуск команды? Для всех команд, которые не являются встроенными, при выполнении запускается подоболочка shell (точная копия текущей интерактивной оболочки shell), и уже она запускает на исполнение введенную пользователем команду (подробнее см. § 2).

Этап 3: приглашение. После завершения выполнения команды снова выводится приглашение командной строки.

1.3.2. Пакетный режим Пакетный режим не требует вмешательства пользователя. Интерпретатор считывает и исполняет команды из строки или построчно из файла сценария shell.

1.4. Набор команд начинающего пользователя Поначалу работа в командной строке вызывает некоторые трудности. Уверенность приходит с освоением частоиспользуемых команд для решения повседневных задач. Опишем некоторые из них в таблице.

5 du -sf использование дискового пространства файлами в домашнем каталоге щего каталога. Если в качестве параметра указан файл (каталог), то выводится информация 1.5. Удаленный доступ к учебному серверу kappa На кафедре ИМО запущен учебный сервер kappa.cs.karelia.ru (далее kappa) с возможностью удаленного доступа. После регистрации в системе студент имеет возможность работать в дисплейных классах ПетрГУ в ОС Linux как локально, так и удаленно. Для обычного входа в систему достаточно ввести логин и пароль в окне, предложенном загрузчиком ОС.

Для удаленного взаимодействия с учебным сервером kappa через SSH-протокол (от англ. Secure Shell) необходим ssh-клиент. В качестве ssh-клиента в ОС Windows можно использовать программу putty.exe. В ОС Linux есть свой ssh-клиент OpenSSH, который можно запустить командой ssh.

Пример 1. # Запуск ssh-клиента для пользователя user в ОС Linux user@epsilon:~> ssh [email protected] Password:

Для файлового обмена данными в ОС Windows с сервером kappa можно использовать программу WinSCP. WinSCP это графический клиент SFTP (от англ. SSH File Transfer Protocol), предназначенный для защищенного обмена файлами между компьютером и серверами. Есть также отдельный WinSCP-модуль для FAR-менеджера. Для файлового обмена в ОС Linux можно использовать утилиты sftp, scp.

Все файлы пользователь должен хранить в своем домашнем каталоге, владельцем которого он является и права на который он может менять. Полный путь к домашнему каталогу: /home/имя_пользователя.

Подробнее об иерархической структуре файловой системы см. в § 6.

§ 2. Простая команда shell Приведем несколько формальных определений, придерживаясь терминологии основного руководства Linux [15].

Определение 2.1. Пробельный разделитель это пробел или табуляция.

Определение 2.2. Управляющий оператор это символ перевода строки или один из операторов || && & ; ; ; | ( ) Определение 2.3. Слово последовательность символов, не являющаяся оператором, ограниченная пробельными разделителями.

Определение 2.4. Простая команда это последовательность слов, разделенных пробельными разделителями, ограниченная управляющим оператором.

Предполагается, что управляющий оператор не является словом.

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

Имя команды соответствует программе (реализации команды), которая хранится на диске и запускается на выполнение при вводе команды в командную строку. Параметры можно разбить на две группы: опции (опциональные параметры) и аргументы (неопциональные параметры).

Опции управляют поведением программы. Они делятся на короткие и длинные. Короткие опции начинаются с символа -, длинные с --. Для некоторых коротких опций имеются длинные аналоги. Так, для команды wc опции -l соответствует --lines. Опция может иметь аргумент. Например, для команды find -type d опция -type c аргументом d указывает на поиск файлов, которые являются директориями. У некоторых команд есть специальная опция -- для завершения списка опций.

Аргументы команды могут быть обязательными (имя_файла для команды rm) и необязательными (имя_файла для команды ls). Чаще всего аргументы задают входные и выходные данные.

2.1. Встроенные и внешние команды Команды shell делятся на две категории:

1) встроенные (внутренние) команды shell (SHELL BUILTINS);

2) внешние программы (GNU SHELL-UTILS).

Основное отличие внешней команды от внутренней заключается в порождении нового подпроцесса [7].

Определение 2.5. Ветвление процесса (forking) это действие, когда либо команда, либо командная оболочка порождает новый подпроцесс, чтобы выполнить какую-либо работу. Порождающий процесс называется родительским, или предком. Порожденный дочерним, или потомком.

После ветвления родительский и дочерний процессы продолжают выполняться параллельно (независимо по времени).

Встроенные команды shell [14] не порождают новый подпроцесс, а выполняются в текущей оболочке shell. Встроенная команда выполняется быстрее и является более производительной. Реализацию встроенной команды выполняет программа bash (исполняемый файл /bin/bash). Количество встроенных команд может быть разным в зависимости от версии командного интерпретатора bash. Полный список встроенных команд для bash 4.1 приведен в таблице 2.

Внешние программы [16] порождают дочерний процесс и выполняются в подоболочке shell (subshell). Реализация внешней команды это отдельный исполняемый файл (программа), который находится в директории /bin. Например, внешняя команда echo8 реализуется программой /bin/echo.

Команда echo вывод строки на экран.

Встроенная команда может иметь внешние аналоги с таким же именем (например, команда echo). Как правило, интерпретатор shell по умолчанию выбирает встроенный вариант (см. пример 2.3). Однако можно запретить использование внутренней команды (см. пример 2.6) или вызвать внешнюю команду вместо внутренней, указав полный путь к внешней программе, как показано в примере 2.1.

Пример 2. # Вызов внешней команды echo вместо встроенной :~> /bin/echo "Я - внешняя!" Ниже приводится набор полезных команд:

• type имя показывает вариант интерпретации команды по умолчанию. Если команда по умолчанию будет проинтерпретирована как встроенная, то выводится "имя is a shell builtin".

Если команда по умолчанию интерпретируется как внешняя, то выводится текущая реализация команды (см. примеры 2.2, 2.3, • type -a проверка, дублируется ли встроенная команда внешней;

• man bash список встроенных команд (BASH BUILTIN COMMANDS);

• help имя справка по встроенным командам;

• which имя вывести путь к внешней программе;

• enable вывести список всех разрешенных встроенных команд;

• enable -n имя запретить использование встроенной команды;

• enable имя разрешить использование встроенной команды.

Внимание! Команда enable является встроенной и, как правило, не дублируется внешней. Поэтому не рекомендуется применять команду enabel -n к самой себе. Приведем несколько примеров использования команд, описанных выше.

Пример 2. # Для встроенной команды, не имеющей внешнего аналога :~> type -a type type is a shell builtin :~> type type type is a shell builtin Пример 2. # Для встроенной команды, имеющей внешний аналог :~> type -a echo echo is a shell builtin echo is /bin/echo :~> type echo echo is a shell builtin Пример 2. # Для внешней команды, не имеющей встроенного аналога :~> type -a grep grep is /usr/bin/grep grep is /bin/grep grep is /usr/bin/X11/grep :~> type grep grep is /usr/bin/grep В примере 2.4 команда grep9 является внешней и имеет три реализации. По умолчанию командный интерпретатор будет использовать реализацию /usr/bin/grep.

Вместо команды type для вывода пути к внешней программе можно использовать команду which (сравните примеры 2.3, 2.4 и 2.5).

Пример 2. # Путь к реализации внешней команды :~> which echo /bin/echo :~> which grep /usr/bin/grep Пример 2. # Запрет использования встроенной команды echo :~> enable | grep echo enable echo :~> enable -n echo :~> enable | grep echo :~> Пример 2. # Разрешение использования встроенной команды echo :~> enable echo :~> enable | grep echo enable echo Пояснение. Для удобства в примерах 2.6 и 2.7 используется конвейер Команда grep поиск в тексте по образцу, см. § 8.

Такая конструкция означает, что в тексте, который выводит на экран команда enable (список разрешенных встроенных команд, каждая команда в отдельной строке), команда grep найдет строку, содержащую слово echo, и выведет ее на экран. В примере 2.6 это строка Если команды echo не окажется в списке разрешенных команд, то команда grep, выполнив поиск, ничего не выводит, и выдается приглашение командной строки для ввода следующей команды (см. пример 2.6).

2.2. Псевдонимы Если требуется часто запускать одни и те же команды с большим количеством параметров, то удобно использовать псевдонимы.

Определение 2.6. Псевдоним это синоним команды, определяемый командой alias.

Команда alias, вызываемая без параметров, выводит список всех определенных синонимов. Часть из них определены пользователем, часть являются предопределенными. Ниже представлен пример создания и удаления пользовательских псевдонимов. Одна и та же команда может иметь несколько псевдонимов.

Пример 2. # Создание псевдонима команды ls :~> alias ls="ls -a" # Удаление псевдонима :~> unalias ls Предопределенные синонимы команд инициализируются при запуске командной оболочки, соответствующие команды alias для них приписаны в конфигурационных файлах (в каких именно зависит от операционной системы). Наиболее часто используемые предопределенные псевдонимы:

•..="cd.." переход из текущего каталога на уровень выше;

•...="cd../.." переход на два каталога выше;

• dir="ls -l" вывод содержимого текущего каталога в виде расширенного списка;

• ll="ls -l" аналогично dir;

• la="ls -la" аналогично dir с выводом скрытых файлов (имена которых начинаются с символа '.');

• o="less" постраничный просмотр текстовых файлов;

• rd="rmdir" удаление пустого каталога.

Внимание! Вместо двойных кавычек "заменяемую команду-строку можно заключать в одинарные '.

2.3. Код возврата Известно, что при завершении любая программа возвращает в операционную систему код возврата, или статус выхода (от англ.

exit status). Команда shell, введенная в консоли, также возвращает код возврата текущей оболочке shell.

Определение 2.7. Код возврата это число в диапазоне 0 255, которое определяет успешность выполнения запущенной программы (команды).

Завершение с кодом ноль (0) является успешным, ненулевое завершение означает неудачу. Также определены следующие специальные значения кода возврата [15]:

• 127 команда не найдена;

• 126 команда найдена, но не может быть выполнена;

• 128 + N прерывание выполнения команды по сигналу с номером N. Например, сигналу SIGTSTP, посылаемому с терминала (Ctrl + Z) для приостановки процесса выполнения команды, будет соответствовать N = 20;

•2 некорректное использование встроенной команды shell.

Управлять значением кода возврата в скрипте shell можно с помощью встроенной функции exit. Код возврата последней команды хранится в специальной переменной $?, значение которой можно вывести на экран (см. пример 2.9) или использовать в сценариях shell.

Пример 2. # Вывод кода возврата последней команды :~> echo $?

§ 3. Cостав командной строки В предыдущих параграфах мы выяснили, что же такое командный интерпретатор shell и как выглядит инструкция языка командной оболочки shell. Пока ограничимся рассмотрением только простых команд языка shell. Речь об объединении простых команд в списки и о структуре сложной команды shell пойдет в § 5.

Как shell выполняет разбор командной строки? Прежде чем ответить на этот вопрос, необходимо понять, что может встретить интерпретатор shell в командной строке при ее разборе.

Цель данного параграфа описать, какие еще средства языка можно использовать в командной строке shell, кроме простых команд.

Перечислим основные, наиболее часто используемые:

• метасимволы, • подстановка команд, • перенаправление ввода-вывода, • подстановки в именах файлов (шаблоны), • регулярные выражения.

Причем шаблоны и регулярные выражения присутствуют в командной строке не сами по себе, а являются аргументами какой-нибудь команды shell.

3.1. Метасимволы В каждом языке, как правило, имеются символы, которые в разных условиях ведут себя по-разному. Именно поэтому они называтся метасимволами.

Внимание! Набор таких символов для каждого языка свой. Приведем стандартное определение.

Определение 3.1. Метасимвол это символ, принимающий в зависимости от контекста несколько различных значений.

Для нас интересны следующие группы метасимволов:

• метасимволы языка shell;

• метасимволы в шаблонах имен файлов;

• метасимволы языка регулярных выражений.

Интерпретатор bash способен распознавать все эти группы метасимволов, однако делает он это на разных стадиях разбора командной строки (более подробно об этом см. в § 4). Различные варианты толкования метасимволов могут приводить к ошибкам, когда пользователь подразумевает одно значение, а shell назначает другое. Рассмотрим подробнее две первые группы. Метасимволы регулярных выражений имеет смысл изучить непосредственно перед их использованием в § 8.

3.1.1. Метасимволы языка shell Точный список метасимволов bash можно посмотреть в руководстве [15] или выполнив команду man bash. Метасимволом bash считается пробел, табуляция и символы:

При разбиении командной строки на слова эти символы считаются границами слов. Простейшим примером метасимвола shell является пробел. Обнаруживая пробел, интерпретатор считает текущее слово законченным. Например, создав файл с именем my file (именно так, с пробелом) с помощью команды touch my file, мы обнаружим два файла: my и file вместо одного предполагавшегося.

Пример 3. # Имя файла c пробелом (не экранируется) :~> touch my file :~> ls -l -rw-r--r-- 1 user group 0 Июн 30 2011 file -rw-r--r-- 1 user group 0 Июн 30 2011 my 3.1.2. Метасимволы в шаблонах имен файлов Метасимволы шаблонов используют для задания группы файлов в виде параметра какой-либо команды. Таким образом, одну команду можно применить сразу к нескольким файлам, имена которых удовлетворяют шаблону. Метасимволами шаблонов являются:

• * любая (в том числе и пустая) последовательность символов, не являющаяся '.'. Символ '.' в начале имени файла должен указываться явно;

•? любой одиночный символ;

• [...] любой из заключенных в скобки символов;

• [!...] любой символ, не совпадающий с символами, заключенными в скобки;

• [...] аналогично предыдущему;

• [:класс:] класс символов POSIX (см. таблицу 3).

Для унификации описания наборов символов стандартом POSIX зарезервированы так называемые классы символов.

1 Все буквы английского алфавита в обоих регистрах 2 Все буквы английского алфавита в обоих регистрах и 3 [:digit:] Все арабские цифры 4 [:cntrl:] Все управляющие символы 5 [:blank:] Все горизонтальные пробельные разделители 6 [:xdigit:] Все шестнадцатеричные цифры 7 [:print:] Все печатные символы, включая пробел 8 [:punct:] Все знаки пунктуации 9 [:space:] Все пробельные разделители 10 [:lower:] Все буквы английского алфавита в нижнем регистре 11 [:upper:] Все буквы английского алфавита в верхнем регистре Если интерпретатор встречает один из метасимволов шаблонов, он производит подстановку значения, соответствующего символу. Поэтому чаще метасимволы в шаблонах называют подстановками в именах файлов, что соответствует действиям интерпретатора (более подробно о разборе подстановок см. в § 4).

3.2. Средства экранирования Поскольку в разных случаях может потребоваться разная интерпретация (специальное значение либо обычное значение) метасимвола, то необходим инструмент, управляющий выбором нужного значения.

Определение 3.2. Экранирование (quoting) отмена специального значения метасимвола.

Экранирование заставляет интерпретатор трактовать метасимвол как обычный символ. Можно выделить три варианта экранирования символов:

1) эскейп-экранирование;

2) использование кавычек;

3) экранирование в стиле ANSI-C.

3.2.1. Эскейп-экранирование Эскейп-экранирование это использование символа обратной косой черты (\, backslash) для экранирования метасимвола, следующего за \. Символ \ сообщает интерпретатору, что следующий за ним метасимвол должен восприниматься как обычный.

Сам символ обратной косой черты называется эскейп-символом (от англ. escape character), а обратная косая черта вместе со следующим за ней символом эскейп-последовательностью. Как и в примере 3.1, выполним команду touch, только экранируем символ пробела.

Пример 3. # Имя файла с пробелом (экранируется) :~> touch my\ file :~> ls -l Пример 3. # Вывод символа ;

:~> echo ;

:~> echo \;

Эскейп-экранирование достаточно трудоемкий способ, если нужно экранировать сразу несколько символов.

Внимание! Для некоторых команд (например, echo и sed) символ \ выполняет обратное действие переключает обычное значение символа на специальное. Например, \n для команды echo с опцией -e означает перевод строки.

3.2.2. Экранирование кавычками Экранировать символы можно с использованием одинарных или двойных кавычек.

Одинарные кавычки отменяют специальные значения всех заключенных между ними метасимволов. Однако между ними не должно быть внутренней одинарной кавычки, иначе она будет восприниматься как закрывающая.

Двойные кавычки экранируют все метасимволы кроме \, $ и обратной кавычки. Cимвол обратной косой черты внутри двойных кавычек сохраняет особое значение только в том случае, если предшествует символам $,, ", \ или символу перевода строки.

Пример 3. # Экранирование двойными кавычками # 1: \ - теряет специальное значение, $ - сохраняет :~> echo "a \ b $c" a\b # 2: \ - сохраняет специальное значение, $ - теряет :~> echo "b \$c" Пояснение. Символ $ используется с позиционными параметрами и определенными пользователем переменными как простая подстановка значения переменной (см. § 7). В примере 3.4 в случае 1 символ $ означает начало имени переменной. Интерпретатор обращается к переменной $c и подставляет в строку ее значение (пустое).

Пример 3. # 1: $ - теряет специальное значение :~> echo 'b $c' # 2: $ и ' - теряют специальное значение :~> echo "b '$' c" b '$' c Если не экранировать знак $ внутри двойных кавычек, то он сохраняет специальное значение (означает простую подстановку значения переменной c). Сравните случаи 2 в примерах 3.4 и 3.5; в обоих случаях мы пытаемся экранировать символ $.

В следующем примере показано, как интерпретатор реагирует на нечетное число двойных (одинарных) кавычек. После ввода команды echo и нажатия клавиши Enter выдается повторное приглашение командной строки (символ >). Таким образом интерпретатор дает понять, что предыдущая команда не закончена. В данном случае ожидается ввод символа двойных кавычек. Получив то, что хотел, интерпретатор выводит результат. К строке добавляются еще два символа перехода на новую строку, соответствующих нажатию клавиши Enter.

Пример 3. # Нечетное число двойных кавычки - ожидание :~> echo "a"b"[Enter] > [Enter] [пустая строка] [пустая строка] Если же мы хотим вывести символ двойной кавычки внутри двойных кавычек, то его следует экранировать. Например, так:

Пример 3. # Вывод двойной кавычки внутри двойных :~> echo "a\"b" a"b А вот такое экранирование двойной кавычки, как в примере 3.8, не пройдет. Однако и в этом случае поведение интерпретатора вполне предсказуемо. Итоговая строка будет состоять из двух частей: первая подстрока a' заключена в двойные кавычки (специальное значение символа ' теряется); вторая подстрока b"[Enter] заключена в одинарные кавычки (специальное значение символа " теряется).

Пример 3. # Неверное экранирование внутренней двойной кавычки :~> echo "a'"'b" > [Enter] a'b" [пустая строка] 3.2.3. Экранирование в стиле ANSI-C Экранирование в стиле ANSI-C имеет следующий синтаксис:

и позволяет подставлять последовательности, определенные стандартом языка Си.

Например, символы форматирования (\n, \t); символы, заданные восьмеричным кодом (\ooo); символы, заданные шестнадцатеричным кодом (\xHH).

Обратите внимание на экранирование одинарных кавычек внутри строки в примере 3.9.

Пример 3. # Примеры эскейп-последовательностей :~> echo $'строка1\nстрока2' строка строка :~> echo $'пробел\x20имеет\x20код 20' пробел имеет код :~> echo $'код цифры \'\x30\' = 48' код цифры '0' = 3.3. Подстановка команды Подстановка команды означает использование вывода команды как обычного текста. Как правило, подстановки команд применяются в параметрах других команд либо как значения, присваиваемые переменным в скриптах. Синтаксис описания подстановки команды:

1-й вариант (в обратных кавычках):

2-й вариант: $(команда) Также возможно осуществить вложение подстановок путем комбинации двух вариантов, экранируя символы обратной кавычки при необходимости.

Пример 3. # Вывод размера занимаемого дискового пространства # 1: В домашнем каталоге :~> echo "Объем домашнего каталога = du -sh ~ " Объем домашнего каталога = 90,0M /home/student # 2: В текущем каталоге :~/bin> echo "Объем текущего каталога = du -sh $(pwd) " Объем текущего каталога = 2,7M /home/student/bin Пояснение. В примере 3.10 мы используем команду du для определения, сколько занимают места на диске файлы домашнего и текущего каталогов. Поскольку эту информацию мы выводим с помощью команды echo, необходимо du оформить как подстановку команды.

Иначе имя команды и ее параметры будут интерпретироваться как обычный текст.

В качестве аргумента команды du в первом случае указано обозначение домашнего каталога (). Во втором случае аргументом du является подстановка команды pwd, которая выводит имя текущего каталога.

Внимание! Если подстановку команды du -sh $(pwd) применить к каталогу, имя которого содержит пробелы (например, С 1), то будет выдана ошибка. Такая неприятность связана с тем, что при выводе результата подстановки $(pwd) символ пробела не экранируется (как, впрочем, и другие метасимволы). Исправить ситуацию поможет экранирование с помощью двойных кавычек, они сохранят специальное значение сивола $, что необходимо для совершения подстановки.

Экранирование с помощью одинарных кавычек в этой ситуации не годится. Можно поступить, например, так:

Пример 3. # Вывод размера занимаемого дискового пространства # В текущем каталоге (с пробелами) :~/С 1> echo "Объем текущего каталога= du -sh \"$(pwd)\" " Объем текущего каталога= 2,7M /home/student/С 3.4. Средства перенаправления Каждая команда shell при выполнении интерпретатором связана с набором открытых файлов для ввода (входной поток) и вывода (выходной поток) данных. Каждый из этих файлов идентифицируется определенным числом, которое называют дескриптор файла. Файлы стандартных потоков ввода-вывода имеют следующие дескрипторы:

0 стандартный поток ввода (stdin), по умолчанию ассоциирован с 1 стандартный поток вывода (stdout), по умолчанию ассоциирован 2 стандартный поток вывода ошибок (stderr), по умолчанию ассоциирован с экраном.

Стандартные потоки ввода-вывода можно перенаправить, используя операторы перенаправления (переадресации), см. таблицу 3.

Перенаправление означает, что при вызове команды можно указать, откуда принимать входные данные и куда направлять выходные данные и сообщения об ошибках.

1 команда > файл Перенаправление вывода в файл (с перезаписью). Если файл не существует, то он будет 2 команда >> файл Перенаправление вывода в файл (с дозаписью 3 команда 2> файл Перенаправление ошибок в файл 4 команда > файл Связывание потоков вывода и ошибок. Перенаправляет вывод и ошибки в файл с дескриптором 1 (с перезаписью) 5 команда >& файл Аналогично предыдущему оператору. Ошибки 6 команда >> файл Аналогично предыдущему оператору, но с дозаписью в конец файла 7 команда < файл Перенаправление ввода из файла 8 команда./c_program 2> /dev/null § 4. Алгоритм разбора командной строки Алгоритм разбора командной строки интерпретатором shell выполняется каждый раз при вводе команды или запуске сценария и поэтому заслуживает отдельной главы. Выделим основные действия интерпретатора в виде следующего набора шагов.

Шаг 1. Чтение входного текста (ввода) из файла, командной строки или терминала.

Шаг 2. Разбор ввода на слова и операторы в соответствии с правилами экранирования. На этом этапе все экранированные метасимволы потеряют свое специальное значение (исключением являются особые случаи, когда экранирование отменяет обычное значение метасимвола и включает специальное.) Шаг 3. Разбор слов с выделением команд.

Шаг 4. Реализация подстановок, выделение параметров команд.

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

Шаг 5. Реализация перенаправлений.

Шаг 6. Исполнение команд.

Шаг 7. Ожидание завершения и получение кода возврата.

Внимание! Здесь снова следует обратить особое внимание на экранирование метасимволов.

Как было отмечено ранее в § 3, разные группы метасимволов, распознаваемых интерпретатором shell, разбираются на разных этапах алгоритма. На шаге 2 учитывается набор метасимволов языка shell.

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

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

Рассмотрим отдельно использование символа * (звездочка).

Пример 4. # Вывод списка файлов текущего каталога с расширением.c :~> ls -l *.c -rw-r--r-- 1 user group 0 Июн 30 2011 file.c -rw-r--r-- 1 user group 0 Июн 30 2011 my.c В данном случае мы используем шаблон-подстановку в именах файлов *.c. Символ звездочки не экранирован, поэтому подстановка будет реализована на шаге 4. В данном случае она означает поиск в текущем каталоге списка файлов, чьи имена соответствуют шаблону с последующей его заменой.

А теперь рассмотрим еще один пример со звездочкой. В данном случае команда find выполняет поиск файлов по имени в домашнем каталоге.

Пример 4. # Поиск файлов в домашнем каталоге с расширением.c :~> find ~ -name "*.c"./file.c./my.c В примере 4.2 символ звездочки экранирован с помощью двойных кавычек. Это означает, что шаблон *.c будет аргументом для функции find и никакой подстановки на шаге 4 выполнено не будет. За реализацию этого шаблона отвечает команда find на шаге 6 алгоритма.

Внимание! Если убрать в примере 4.2 двойные кавычки, то вместо шаблона *.c на шаге 4 будет подставлен список файлов текущей директории (а вовсе не домашнего каталога), как и в примере 4.1. Тогда команда find будет выполнять поиск файлов из указанного списка в домашнем каталоге, что вряд ли соответствует замыслу автора и, скорее всего, приведет к ошибке.

4.1. Алгоритм поиска команды для исполнения Исполнение команд происходит на шаге 6 алгоритма. К этому моменту текст командной строки уже разобран, выделены команды и определены их аргументы. Далее интерпретатор shell будет в цикле выполнять поиск реализаций, которые соответствуют именам команд, и запускать программы на выполнение. Схема поиска реализации команды примерно следующая:

1) Если имя команды не содержит символы / (slash), то shell ищет реализацию по имени команды:

(a) среди функций. Существует ли функция shell с этим именем?

(b) среди встроенных команд. Существует ли встроенная команда shell с таким именем?

(c) среди внешних утилит. Существует ли файл с таким именем в каталогах поиска (см. пояснение ниже)?

2) Если поиск не дал результатов, то будет переход к шагу 7 алгоритма с кодом завершения 127.

3) Если поиск был успешен или в имени команды есть символы /, (a) если файл имеет исполняемый формат, то произойдет запуск файла-программы на исполнение;

(b) если файл имеет неисполняемый формат и не является директорией, то предполагается, что это сценарий shell. Для выполнения этого сценария будет запущена подоболочка 4) Если команда была запущена в интерактивном режиме (не в фоновом), то нужно ждать завершения и переходить к разбору следующей команды.

Пояснение. Каталоги поиска это каталоги, прописанные в переменной окружения shell с именем PATH. Список всех каталогов поиска можно вывести командой echo $PATH (см. § 7).

§ 5. Структура сложной командной строки Кроме простых команд, интерпретатор shell допускает использование более сложных конструкций, таких как конвейеры, списки команд, операторы группировки команд, управляющие операторы и т. д.

Такие средства языка shell обеспечивают обмен данными или организацию выполнения команд в определенной последовательности.

5.1. Конвейер Иногда требуется, чтобы в качестве аргумента какой-либо команды передавались данные, сгенерированные другой командой. Можно использовать для этой цели файловый обмен и операторы перенаправления, но есть более удобный способ конвейер. Принцип действия этой конструкции оправдывает название и действительно схож с обычным производственным конвейером.

Определение 5.1. Конвейер (pipeline) это последовательность команд, в которой стандартный вывод предшествующей команды перенаправляется на стандартный ввод последующей.

Общий синтаксис определения конвейера следующий:

[time [-p]] [!] команда1 [| команда2...] Квадратные скобки обозначают необязательные аргументы. Применение time обеспечивает сбор статистики о времени выполнения конвейера (реальное время, пользовательское время, системное время).

Опция p управляет форматом вывода статистики.

Каждая команда в конвейере выполняется в подоболочке (как отдельный процесс). Код возврата конвейера совпадает с кодом возврата последней выполненной команды в конвейере. Символ ! инвертирует код возврата. Это можно использовать, например, в условных операторах.

Наиболее часто конвейер используется в минимальном варианте, т. е. выполнются только команды, разделенные оператором |, который называется программным каналом (pipe).

Как будет работать конвейер в случае возникновения ошибки при выполнении какой-либо команды? Рассмотрим примеры 5.1 и 5.2, для обоих выведем код возврата. Напомним, что успешным является код возврата, равный нулю.

Пример 5. # Подсчет числа встроенных команд shell # 1: Без ошибки :~> enable | wc -l # Код возврата :~> echo $?

# 2: C ошибкой в первой команде :~> enbl | wc -l bash: enbl: команда не найдена # Код возврата :~> echo $?

# 3: C ошибкой во второй команде :~> enable | wcc -l bash: wcc: команда не найдена # Код возврата :~> echo $?

В примере 5.1 конвейер состоит из двух команд и неверно задано имя команды (сначала первой, затем второй). Ошибку будет инициировать интерпретатор bash. Можно заметить, что ошибка в первой команде никак не влияет на код возврата всей конструкции. При этом вторая команда выполняется все равно, принимая от первой пустой поток входных данных. Ошибка во второй команде меняет код возврата.

В примере 5.2 укажем имя несуществующей директории. Теперь ошибку инициирует сама команда ls. При этом вторая команда выполняется и выдает успешный код возврата.

Пример 5. # Подсчет числа файлов и папок в директории sd # Директории sd не существует :~> ls -l sd | wc -l ls: невозможно получить доступ к sd: Нет такого файла или каталога # Код возврата :~> echo $?

5.2. Списки команд Конвейеры могут объединяться в более сложные конструкции языка shell (списки) с помощью управляющих операторов.

Определение 5.2. Список команд это последовательность конвейеров, разделенных операторами ;, &, &&, || и ограниченных ;, & или переводом строки.

Если команды (или списки команд) разделены оператором ;

то они выполняются последовательно. Интерпретатор shell будет ожидать завершения текущей команды и затем запустит на выполнение следующую. Кодом завершения всей конструкции будет код завершения последней команды (командаN).

Если команды (или списки команд) разделены оператором & то они будут запущены на выполнение параллельно (независимо по времени). Каждая команда будет выполняться в своей подоболочке в фоновом режиме. Когда команда работает в фоновом режиме, то в командную строку можно параллельно вводить другие команды (см. § 6). В этом случае интерпретатор shell не будет ждать завершения выполнения фоновой команды (команда1,..., командаN-1) и вернет нулевой код возврата. Код возврата всей конструкции будет совпадать с кодом возврата последней команды (командаN).

Операторы условного выполнения && и || группируют команды (конвейеры команд) по принципу логического И и ИЛИ, однако имеют одинаковый приоритет, который ниже, чем у & и ;. Конструкция команда1 && команда2 означает выполнение команды2 при успешном выполнении команды1;

команда1 || команда2 означает выполнение команды2 при неуспешном выполнении команды1.

Код возврата конструкций И и ИЛИ совпадает с кодом возврата последней выполненной команды в списке.

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

где при успешном выполнении команды1 выполняется команда2, иначе команда3.

5.3. Группировка команд Для изменения приоритета операторов условного выполнения используют группировку команд в скобках () и {}.

Группировка команд в круглых скобках () выполняется в подоболочке shell.

Группировка команд в фигурных скобках {} выполняется в текущей оболочке shell.

Внимание! Содержимое скобок обязательно отделяют от самих скобок пробелом (см. пример 5.3).

Пример 5. # Вывод имени и группы пользователя в файл user.info # Без пробела - ошибка :~> {id -un; id -gn;} > user.info bash: syntax error near unexpected token }' # C пробелом - правильно :~> { id -un; id -gn; } > user.info Кроме вышеперечисленных средств группировки команд, в языке shell существуют условные, циклические операторы, функции и т. д. Но применять их в командной строке не очень удобно. Такие конструкции используют в основном в сценариях shell, поэтому они описаны в § 7.

§ 6. Управление файлами и процессами Для корректной работы в командной строке shell необходимы некоторые базовые знания об архитектуре ОС Linux, организации файловой системы, подсистеме управления процессами и т. д. В рамках данного учебного пособия нет возможности рассмотреть эти темы подробно, поэтому ограничимся небольшим объемом информации, необходимой на практике.

6.1. Двухуровневая архитектура ОС Linux Двухуровневая модель архитектуры ОС Linux подразумевает разделение функциональных обязанностей между уровнем ядра системы и уровнем приложений.

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

1) процесс запрашивает услугу ядра;

2) выполняется системный вызов определенной процедуры ядра;

3) ядро выполняет запрос от имени процесса;

4) процесс получает необходимые данные.

Приложения (процессы) представляют пользовательский уровень, устройства аппаратный уровень. Системный уровень реализован в ядре и включает интерфейс системных вызовов и аппаратный контроль.

Важнейшими компонентами ядра являются:

• файловая подсистема;

• подсистема управления процессами;

• подсистема ввода-вывода.

6.2. Управление файлами Нельзя сказать, что в настоящее время для ОС Linux существует какая-то одна стандартная файловая система (ФС). Популярные на сегодняшний день реализации ФС для ОС Linux (ext3, ext4, reiserfs, btrfs и т. д.) используют основные идеи организации ФС s5 для ОС Unix.

6.2.1. Файл и inode Прежде чем перейти к понятию файловой системы, остановимся на вопросе Что такое файл?.

Определение 6.1. Файл именованная структура данных с последовательным доступом (доступ к элементам в определенном порядке).

Ключевая идея организации ФС для ОС Linux:

ВСЕ ЯВЛЯЕТСЯ ФАЙЛОМ!

Файлом является в прямом смысле действительно все: каталоги, HDD (жесткий диск), параллельные порты, web-подключения и т. д. Поэтому для приложения доступ к дисковому файлу неотличим от доступа, например, к принтеру.

Основной особенностью физической организации файловой системы (см. подробнее в [5]) в ОС Linux является отделение имени файла от его характеристик.

Можно сказать, что любой файл имеет метаданные, хранящиеся в отдельной структуре, называемой индексным дескриптором, или inode (от англ. Information NODE). Какие метаданные хранятся в inode? Перечислим некоторые: идентификатор владельца файла, права доступа к файлу, тип файла, число ссылок на данный inode (количество жестких ссылок), размер файла и т. д.

Каждый индексный дескриптор имеет уникальный номер в пределах одной файловой системы. Номера индексных дескрипторов хранятся в специальных inode-таблицах. На самом деле, номер inode является уникальным именем файла.

Однако обычные файлы или каталоги имеют привычные нам символьные имена.

Определение 6.2. Символьное имя файла жесткая ссылка (hard link) на индексный дескриптор файла.

Собственно поэтому имя файла не принадлежит метаданным. Кроме того, должно быть установлено соответствие между полными символьными именами (путь + имя) и их inode, например с помощью иерархии каталогов. При создании файла, например, командой выделяется индексный дескриптор со свободным номером и определяется символьное имя.

Символьных имен (жестких ссылок) у одного файла может быть много. Вывести номер индексного дескриптора позволяет команда ls -il, см. пример 6.1.

Пример 6. # Вывод номера inode :~> touch f_name :~> ls -il f_name 4664074 -rw-r--r-- 1 user students 0 Июл 13 2011 f_name Команда ls -il (как и ls -l) отображает в колонке перед именем пользователя user количество жестких ссылок (1 в данном примере).

Создать жесткую ссылку на файл можно командой Пример 6. # Создание жесткой ссылки :~> ln f_name f_link :~> ls -li f_name f_link 4664074 -rw-r--r-- 2 user students 0 Июл 13 12:45 f_link 4664074 -rw-r--r-- 2 user students 0 Июл 13 12:45 f_name В примере 6.2 создается новый файл с именем f_link с таким же номером индексного дескриптора, как и у f_name. Теперь жестких ссылок на inode с номером 4664074 стало две.

Если теперь отредактировать файл f_link, то автоматически изменения будут продублированы в файле f_name, см. пример 6.3.

Пример 6. # Изменение файла :~> echo "Hello" > f_link :~> ls -li f_name f_link 4664074 -rw-r--r-- 2 user students 6 Июл 13 2011 f_link 4664074 -rw-r--r-- 2 user students 6 Июл 13 2011 f_name musen@epsilon:~> cat f_name Hello Индексный дескриптор (файл) не будет удален до тех пор, пока на него существует хотя бы одна жесткая ссылка.

6.2.2. Типы файлов В ОС Linux выражение тип файла не характеризует содержимое файла (графический, текстовый, мультимедиа и т. д.), а указывает на то, что он является файлом с данными, каталогом или, например, физическим устройством. Файл интерпретируется как поток байтов, интерпретация содержимого оставлена приложениям. Перечислим основные типы файлов:

1) обычный файл (-);

2) каталог (d);

3) символическая ссылка (l);

4) символьный файл (c);

5) файл устройства (b);

6) именованный канал (p);

7) сетевой сокет (s).

Символы, соответствующие типам файлов, отображаются при выводе информации о файле командой ls -l (первый символ в строке).

6.2.3. Символические ссылки Символическая ссылка (soft link) это файл, содержащий путь к другому файлу и имеющий специальный тип (тип l). Символичеcкая ссылка это аналог ярлыка в ОС Windows. Символические ссылки создаются командой В примере 6.4 показано, что при выводе информации о файле командой ls -l указывается тип файла (тип l) первый символ строки, и имя файла, на который указывает данная символическая ссылка.

Пример 6. # Создание символической ссылки :~> ln -s f_name s_link :~> ls -l s_link lrwxrwxrwx 1 user students 13 Июл 13 2011 s_link -> f_name 6.2.4. Права доступа к файлу ОС Linux поддерживает два способа управления доступом к файлу: традиционный (унаследованный от ОС Unix) и основанный на использовании списков доступа ACL (от англ. Access Control List).

Поскольку использование ACL имеет отношение больше к сетевой безопасности, то в рамках данного учебного пособия на этой теме останавливаться не будем. Подробнее об ACL можно прочитать в работе [9] или руководстве к командам acl, setfacl, getfacl.

Традиционный способ подразумевает деление пользователей на три категории по отношению к конкретному файлу:

1) владелец файла (u);

2) пользователь группы, с которой ассоциирован файл (g);

3) любой другой пользователь (o).

При этом пользователь может предпринять попытку доступа к обычному файлу тремя способами: прочитать его (r), записать в него данные (w), исполнить его (x).

Для вывода сведений о правах доступа можно опять воспользоваться командой ls с опцией -l.

Пример 6. # Вывод информации о файлах, включая права доступа :~> ls -l -rwxr-xr-x 1 user group 1024 Июл 11 15:43 file.sh drwx--x--x 18 user group 4096 Мар 23 20:51 public_html Права доступа к файлу file.sh в данном примере определяются символами (в строке вывода команды ls) со второго по девятый. Первые три символа подстроки представляют права владельца rwx (владелец имеет все права), второй набор из трех символов r-x права группы, третий r-x права всех остальных (в данном случае пользователи группы и все остальные имеют только права чтения и выполнения.

Права доступа к каталогам имеют несколько другое значение.

Чтение каталога позволяет получать список содержимого каталога файлов и подкаталогов; запись в каталог создавать новые файлы, переименовывать и удалять старые; право исполнения катапереходить в него командой cd (или программно, например лога запускать программы из этого каталога).

Права доступа к файлу контролируются владельцем файла. Помимо владельца, сменить права доступа может только суперпользователь (пользователь с привилегиями root), который имеет полный доступ к всем файлам (ограничения, накладываемые правами доступа, к нему не применяются).

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

Символьный синтаксис использует ранее введенные мнемонические обозначения для категорий пользователей (u, g, o, a) и прав (r, w, x, s, t), а также знаки арифметических операций для добавления права (+), удаления (-) и установки (=), см. пример 6.6.

Права могут быть заданы в числовой форме, где вместо символов (rwx) используются их числовые эквиваленты: r 4; w 2; x 1.

Числовой режим состоит не более чем из четырех восьмеричных цифр (от нуля до семи): первая цифра для параметров s,t, вторая для владельца (u), третья для группы (g), четвертая для всех остальных (o). Например, числовым эквивалентом для rwx будет цифра 7 (если сложить цифры, эквивалентные буквам).

Пример 6. :~> ls -l -rwxr-xr-x 1 user group 1024 Июл 11 15:43 file.txt :~> chmod a+rw file.txt :~> ls -l -rwxrwxrwx 1 user group 1024 Июл 11 15:43 file.txt При создании файлам и каталогам по умолчанию назначаются права 0644 и 0755 соответственно (незначащий 0 вначале можно не учитывать). Эти значения получаются наложением маски на значение режима полного доступа для файлов (0666) и каталогов (0777) по следующей формуле:

Пояснение. Разница в режимах полного доступа для файлов и каталогов вполне очевидна. Это обусловлено тем, что права доступа для файлов и каталогов отличаются друг от друга, как было сказано выше. Полный доступ к обычному файлу исключает право на выполнение по умолчанию. Действительно, зачем делать исполняемым каждый созданный файл? А вот если файл является, например, сценарием shell, то добавить право на выполнение такому файлу придется вручную командой chmod.

Посмотреть текущее значение маски можно командой umask.

Пример 6. :~> umask Упражнение: убедитесь, что при заданной маске 022 права по умолчанию для файлов устанавливаются равными 644, а для каталогов 755.

6.2.5. Файловая система Понятие файловая система включает в себя три основных значения:

1) Функции ядра системы, с помощью которых реализован логический доступ к файлам и каталогам файловая подсистема. Файловая подсистема обеспечивает интерфейс доступа к данным, контролирует права доступа, перенаправляет запросы, адресованные периферийным устройствам;

2) Служебные структуры данных на носителях, обеспечивающие абстракцию (конкретной аппаратной реализации) файлов и каталогов;

3) Иерархически организованную с помощью каталогов систему файлов (логическую структуру ФС).

В ОС Linux логическая структура ФС регламентируется стандартом FHS (от англ. Filesystem Hierarchy Standard). Согласно этому стандарту все файлы и каталоги находятся внутри корневого каталога с именем / (slash), независимо от того, расположены они на разных физических носителях или нет. Подкаталоги корневого каталога обычно имеют специальное назначение, перечислим некоторые в таблице 5.

Подкаталоги специального назначения Для некоторых каталогов существуют короткие сокращения. Например, точка (.) обозначает текущий каталог; две точки (..) каталог на уровень выше. В языке shell есть подстановки тильды, которые часто используются как сокращения. Каждая подстановка тильды соответствует некоторой переменной окружения shell:

домашний каталог (переменная HOME);

текущий каталог (переменная PWD);

предыдущий каталог (переменная OLDPWD).

Управление процессами Рассматриваемая нами ОС Linux является примером многозадачной системы. Это означает, что несколько приложений могут выполняться параллельно, разделяя процессорное время, память, периферийные устройства и другие ресурсы. Для описания конкретного экземпляра программы, выполняемого в системе, используется термин процесс.

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

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

6.3.1. Иерархия процессов Процесс как объект ОС создается посредством системного вызова fork(). В системе создается дубликат процесса, выполнившего fork(), который затем может быть замещен новым кодом. Таким образом, все процессы системы образуют иерархию родитель-потомок.

Процессы имеют уникальные идентификаторы (PID). Стартовый код ядра системы условно имеет PID 0. Он не создается системой управления процессами, поэтому, строго говоря, процессом не является. В дальнейшем будем его называть прапроцесс. Прапроцесс с PID 0 порождает процесс init, имеющий PID 1. Процесс init, в свою очередь, является предком всех процессов в системе, выполняющихся в пользовательском пространстве.

Пример 6.8 демонстрирует применение команды pstree для вывода фрагмента дерева процессов в некоторый момент времени. ОтУправление файлами и процессами метим, что в ходе сбора данных о процессах команда pstree видит в том числе и процесс, представляющий саму программу pstree.

Из примера 6.8 видно, что процесс init порождает несколько процессов mingetty эмуляторов терминала, предоставляющих интерфейс для запуска командного интерпретатора. Как правило, в системе создается несколько эмуляторов терминала, доступных через Ctrl+Alt+Fn, где n номер эмулятора (обычно, в диапазоне 1 6).

При вводе пользователем имени и пароля, эмулятор mingetty замещается процессом login, который порождает дочерний процесс и запускает в нем программу bash (/bin/bash) командный интерпретатор, обеспечивающий диалог пользователя с системой (эти действия уже обсуждались ранее в § 1). В нашем случае с помощью bash мы запустили программу pstree, для которой bash создал еще один дочерний процесс.

Пример 6. init-+-acpid |-auditd---{auditd} |-login---bash---pstree |-5*[mingetty] -upowerd---{upowerd} В примере 6.8 приведены только процессы, выполняющиеся в так называемом пользовательском пространстве. Ряд процессов выполняется в ядре системы это всевозможные планировщики ресурсов, драйверы и т. д.

Полный перечень процессов можно вывести посредством команды ps -Af, см. пример 6.9. Столбец PPID отображает идентификатор процесса-родителя. Обратите внимание, что, помимо init, прапроцессом с PID 0 порождается процесс ядра kthreadd c PID 2, являющийся планировщиком процессов (строго говоря, потоков, однако разница между этими понятиями будет пояснена в последующих курсах). Подробнее о процессах и потоках см. в работе [5].

Пример 6.

UID PID PPID C STIME TTY TIME CMD

...

...

6.3.2. Сигналы В реальных приложениях процессы не могут быть абсолютно изолированы друг от друга: необходимы средства, обеспечивающие возможность взаимодействия, обмена данными между процессами. Например, один из процессов может поставлять данные из некоторого источника (например, клиент электронной почты получает данные от пользователя), а другой процесс обрабатывать (реализация протокола отправки электронной почты). По этой причине в большинстве многозадачных систем предусмотрены средства межпроцессного взаимодействия (IPC). Одним из средств IPC является конвейер, см. § Простейшим средством IPC являются сигналы. Посланный процессу сигнал прерывает выполнение процесса. Получив сигнал, процесс может его обработать выполнить определенную последовательность действий, однако никаких дополнительных данных посредством сигнала передать нельзя. Если процесс не обрабатывает сигнал самостоятельно, то выполняется стандартный обработчик, который, как правило, приводит к принудительному завершению процесса.

Сигналы идентифицируются номерами целыми числами. В ОС Linux имена сигналов это числовые константы, которые определены в заголовочном файле signal.h стандартной библиотеки языка Си (SIGINT, SIGKILL и др.). Номера сигналов могут варьироваться в зависимости от ОС. Список имен сигналов и соответствующие им номера можно вывести с помощью команды kill -l.

Самый простой способ увидеть действие сигналов на практике запустить длительную по времени задачу, например поиск по всей файловой системе, и нажать Ctrl+C. В этом случае процессу будет отправлен сигнал SIGINT, стандартная реакция на который подразумевает завершение процесса.

Другой способ отправки сигнала процессу использовать команду kill -s СИГНАЛ PID, см. пример 6.10.

Пример 6. # Запускаем длительный поиск :~> find / -name '*' >/dev/null 2>& # В соседнем терминале определяем PID процесса :~> ps -Af | grep find user 9337 8027 6 14:09 pts/2 00:00:00 find / -name * user 9345 6683 0 14:09 pts/0 00:00:00 grep find # Отправляем процессу SIGINT :~> kill -s SIGINT Процесс, обработав сигнал самостоятельно, может игнорировать стандартное поведение. Сценарий shell, например, может установить собственный обработчик с помощью команды trap, см. пример 6.11.

Пример 6. # Устанавливаем обработчик trap 'echo "Этот процесс прерывать нельзя!"' SIGINT # Запускаем длительный поиск :~> find / -name '*' >/dev/null 2>& Теперь при попытке отправить сигнал SIGINT запущенному сценарию (по Ctrl+C или с помощью kill) будет выполнена указанная в trap последовательность команд.

Не всякий сигнал можно обработать. Сигнал SIGKILL приводит к незамедлительному завершению (процесс не имеет возможности выполнить какие-либо действия перед завершением). Исключением являются процессы-зомби, процесс init и процессы, заблокированные ядром в ожидании операции ввода-вывода.

6.3.3. Терминальные задачи Процессы идентифицируются в пределах всей системы, что не очень удобно с точки зрения сеанса работы пользователя, вынужденного разыскивать PID своих 3–5 процессов среди нескольких десятков или даже сотен процессов системы и других пользователей. Поэтому, кроме понятия процесс, существует понятие терминальной задачи, которая определена (идентифицируема) в пределах сеанса командного интерпретатора.

Пример 6. # Запуск программы в фоновом режиме:

# - при запуске на экране печатаются JID и PID # - интерпретатор выводит подсказку и пользователь # может исполнять другие команды # - фоновая программа по-прежнему может выводить # на экран :~> find. -name '*.c' & [1] :~>./2.c./1.c С точки зрения bash, одно приложение может быть запущено в интерактивном (основном) режиме работы, несколько в фоновом. Для запуска задачи в фоновом режиме следует завершать команду символом &, см. пример 6.12. При этом интерпретатор выводит приглашение командной строки, не дождавшись завершения задачи, и пользователь может выполнять другие программы в том же терминальном сеансе.

Важно! Следует заметить, что программа в фоновом режиме, если не использованы средства перенаправления стандартных потоков вывода, будет по-прежнему печатать свои сообщения на экране, что может конфликтовать с выводом других программ.

Запущенная в интерактивном режиме программа может быть переведена в фоновый после терминальной остановки командой bg. Терминальная остановка сигнал SIGTSTP, который можно отправить интерактивной задаче, нажав Ctrl+Z.

Перечень задач для текущего терминала может быть выведен командой jobs. При этом каждой задаче ставится в соответствие уникальный идентификатор JID. Перевести одну из фоновых задач в интерактивный режим можно командой fg % jid, где jid идентификатор задачи. Для отправки задаче сигнала можно использовать синтаксис kill -s СИГНАЛ %jid.

В примере 6.13 мы посылаем сигнал SIGTERM для завершения задачи (этот сигнал используется утилитой kill по умолчанию, если никакой другой сигнал не задан).

Пример 6. # Запускаем длительный поиск в фоновом режиме :~> find / -name '*' >/dev/null 2>&1 & [1] :~> kill -s SIGTERM % :~> [1]+ Завершено find / -name '*' > /dev/null 2>& :~> § 7. Сценарии shell Если требуется ввести длинный список команд в командную строку либо использовать достаточно громоздкие управляющие конструкции shell (ветвление, цикл и т. д.), то удобнее оформить эти команды в отдельном файле сценарии shell и запускать его в пакетном режиме.

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

Дадим отпределение сценария, которое справедливо, впрочем, и для любого другого интерпретируемого языка программирования.

Определение 7.1. Сценарий (скрипт) shell это текстовый файл, содержащий допустимые конструкции языка shell и имеющий право на запуск.

Внимание! Необходимо, чтобы первой строкой скрипта была инструкция выбора исполняющего интерпретатора см. [7], в нашем случае это Символ # обозначает начало комментария shell. Если за решеткой следует восклицательный знак #!, то такая последовательность символов (ее называют sha-bang) указывает на выбор интерпретатора для выполнения сценария (/bin/bash).

В качестве интерпретатора может быть указана не только командная оболочка shell, но и любой другой интерпретатор (например, /usr/bin/php) или даже реализация команды (например, /bin/more или /bin/rm).

Обычно скриптам shell присваивают расширение.sh, хотя это и не является обязательным требованием.

Оформление собственных сценариев в едином стиле считается правилом хорошего тона для программиста. А иногда позволяет сэкономить бесценное время на поиск необходимой конструкции и ее модификацию.

В примере 7.1 предлагается один из возможных вариантов оформления shell-сценария.

Пример 7. #!/bin/bash ######################################################### # Сценарий : dtox - преобразование текстового файла DOS к # стандарту UNIX # Автор : Хайнер Стивен # Версия : 1. # Дата : 2002.02. ######################################################### # Описание # Заменяет последовательности "CR LF"признаком конца # строки "LF" # Замечания # Не преобразует символ конца файла DOS CTRL-Z (ASCII 26) 7.1. Запуск сценария Чаще всего сценарии shell запускаются на выполнение как консольные приложения из командной строки. По умолчанию при создании обычного файла ему не присваивается право на выполнение. Поэтому если сценарий уже написан, то для дальнейшего запуска необходимо изменить его права, добавив право на выполнение.

Пример 7. # Добавление права на запуск для владельца :~> chmod u+x script.sh Теперь сценарий можно запустить на выполнение, предварительно сделав переход (cd) в каталог, где находится сценарий (либо указать полный или относительный путь к сценарию). Для запуска скрипта есть два варианта:

в подоболочке shell:./имя_сценария в текущем shell:. имя_сценария или source имя_сценария В первом случае должен быть указан полный путь к сценарию, т. к.

./ предполагает поиск скрипта в текущем каталоге. Если не указать полный путь, и сценарий не найден в текущем каталоге, то интерпретатор попросту его не найдет. Это объясняется тем, что в целях безопасности текущий каталог (./) не включен в список каталогов поиска команды (переменная окружения PATH). Как мы помним из § 4, интерпретатор будет искать имя скрипта именно в каталогах поиска.

Во втором случае скрипт будет запущен командой точка (или source). Это встроенная команда bash, которая запускает сценарий в окружении текущей оболочки. В этом случае полный путь к сценарию можно не указывать, т. к. команда source будет искать сценарий в каталогах поиска, а затем в текущем каталоге.

Каждая строка shell-сценария (кроме, может быть, последней) должна завершаться символом перевода строки.

Выше мы рассмотрели основные составляющие командной строки:

простые команды, метасимволы shell, подстановки команд, шаблоны имен файлов, конвейеры, списки команд и т. д.

В данном параграфе мы опишем основные средства языка shell, чаще всего используемые в сценариях:

• пользовательские переменные;

• массивы;

• переменные окружения;

• подстановка переменных;

• позиционные параметры;

• управляющие конструкции (условные, циклические).

7.2. Пользовательские переменные Словосочетание пользовательские переменные, или переменные интерпретатора shell [6], обычно используют, когда говорят о собственных переменных пользователя, определенных им самостоятельно.

7.2.1. Как определить переменную?

Следует различать имя переменной и значение переменной.

Говоря о переменной, мы подразумеваем пару имя-значение. Присвоить переменной какое-либо значение можно так:

1) имя=[значение] Если значение не указано, то говорят, что переменная имеет пустое значение ( не установлена ). Если значение задано, то переменная имеет значение. Иначе считается, что переменная не определена ( не объявлена ).

7.2.2. Как обратиться к значению переменной?

Для обращения к значению переменной используется простая подстановка значения:

Иногда фигурные скобки, определяющие имя переменной, можно опустить, если это не приведет к неоднозначности (см. пример 7.3).

Пример 7. # test.sh: Имя переменной в фигурных скобках var="string_a"; var1="string_b" echo $var echo ${var} echo $var$var echo ${var}${var1} # Запуск скрипта test.sh :~>./test.sh string_a string_astring_b string_astring_b Пояснение. Интерпретатор не нашел переменную с именем var12, она не объявлена, поэтому вывод ее значения дает пустую строку. Для многосимвольных имен лучше всеже использовать фигурные скобки.

Пояснение. В примере 7.3 команда echo при выводе выполняет конкатенацию (склеивание) значений переменных и строк текста.

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

Если запускать скрипт в подоболочке, то переменные, определенные в этом скрипте, будут недоступны после завершения скрипта. И наоборот, доступ к переменным, определенным в скрипте, можно получить, если запустить скрипт в текущем shell (см. пример 7.4).

Пример 7. # test.sh: Определение переменной my_var my_var="my_string" echo $my_var # Запуск в подоболочке :~>./test.sh my_string :~> echo $my_var :~> # Запуск в текущем shell :~>. test.sh my_string :~> echo $my_var my_string 7.2.4. Типы переменных Язык shell не имеет четко выраженных типов переменных, однако все их можно условно разделить на группы:

• строки символов;

• целые числа;

По умолчанию все переменные bash являются строковыми. Определяющий фактор при их интерпретации значение переменной.

Минимально контролировать типы переменных и устанавливать их атрибуты можно с помощью встроенной команды declare:

• declare -i имя[=значение] определить переменную как целое число. Применительно к такой переменной можно выполнять некоторые арифметические операции без использования специальных функций (таких, как expr);

• declare -a имя определить переменную как массив;

• declare -r имя установить для переменной атрибут только для чтения, аналогично команде readonly имя. При попытке присвоить значение такой переменной будет выдано сообщение • declare -f вывод определений функций;

• declare -F вывод имен функций.

Функция declare, как и функция set, без опций выводит все заданные имена и определения.

Разберем некоторые нюансы обращения с разными типами переменных на примерах.

Если необходимо при выводе строки командой echo сохранить пробельные разделители, то строку следует заключить в двойные кавычки.

Пример 7. # Сохранение разделителей Применение арифметических операций к строке не приведет к ошибке, вместо строки будет подставлено числовое значение, равное нулю.

Пример 7. # Арифметическая операция над строками let "n+=1" # используется значение n равное Применение функции declare -i к переменной, уже имеющей строковое значение, не приведет к изменению значения на нулевое.

Пример 7. # Попытка сменить тип на числовой Если же присвоить строковое значение переменной, которая объявлена как целочисленная, то она будет иметь нулевое значение.

Пример 7. # Присвоение строки числовой переменной 7.2.5. Подстановка переменных Кроме уже известных нам подстановок команды и подстановок в именах файлов, в языке shell имеются и другие подстановки. Напомним, что смысл любой подстановки заключается в замене некой последовательности символов ( подстановки ) на значение, ей соответствующее.

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

${имя:-значение_по_ум} альтернативная подстановка. Если переменная не объявлена или имеет пустое значение, то выводится значение по умолчанию.

${имя:+альт_значение} обратная альтернативная подстановка. Если переменная имеет непустое значение, то выводится альтернативное значение.

${имя:=значение_по_ум} переопределяющая подстановка. Если переменная не определена или имеет пустое значение, то она принимает значение по умолчанию.

${имя:?сообщение_об_ошибке} подстановка ошибки. Если переменная не определена или имеет пустое значение, то выводится сообщение об ошибке.

${имя:смещение} подстановка подстроки. Извлечение подстроки из строки имя, начиная с позиции смещение.

${имя:смещение:длина} подстановка подстроки. Извлечение подстроки, начиная с позиции смещение, заданной длины из строки ${#имя} подстановка длины переменной.

${имя#шаблон} удаление подстроки. Удаляет из переменной наименьшую подстроку, удовлетворяющую шаблону. Поиск ведется с начала строки.

${имя##шаблон} удаление подстроки. Удаляет из переменной наибольшую подстроку, удовлетворяющую шаблону. Поиск ведется с начала строки.

${имя%шаблон} удаление подстроки. Удаляет из переменной наименьшую подстроку, удовлетворяющую шаблону. Поиск ведется с конца строки.

${имя%%шаблон} удаление подстроки. Удаляет из переменной наибольшую подстроку, удовлетворяющую шаблону. Поиск ведется с конца строки.

Пояснение. В первых четырех подстановках, описанных выше, можно не указывать символ двоеточия (:). Это влияет на результат, только если переменная имя не установлена (т. е. объявлена, но имеет пустое значение).

Пример 7. # Переменная var не определена a=${var:-aaa}; b=${var-bbb} # Переменная var имеет пустое значение var= a=${var:-aaa}; b=${var-bbb} # Переменная var имеет значение var=str a=${var:-aaa}; b=${var-bbb} Можно в качестве значения по умолчанию использовать подстановку команды. В примере 7.10 вместо значения переменной mypwd подставляется строка, которую выводит команда pwd, если переменная не задана или имеет пустое значение.

Пример 7. # Подстановка команды pwd :~> echo ${mypwd:- pwd } /home/user Приведем пример 7.11, демонстрирующий проверку наличия переменной в сценарии. Обратите особое внимание на использование команды : это пустая команда. В языке shell необходимо, чтобы каждая строка начиналась с команды, поэтому отдельно подстановку ошибки использовать нельзя.

Почему не годится команда echo? Если переменная my_var не определена или имеет пустое значение, то команды echo и : работают одинаково: выдают сообщение об ошибке. Однако если значение переменной my_var задано, то команда echo, выполняя подстановку, выведет это значение на экран, что было бы нежелательно.

Пример 7. # Проверка наличия переменной my_var : ${my_var:?"Не определена или имеет пустое значение"} Пояснение. Набор вариантов подстановок переменных не ограничивается приведенными выше. Мы рассмотрели наиболее часто используемые подстановки. Кроме того, существуют подстановки переменных для работы с массивами, они будут описаны далее.

7.3. Переменные окружения При запуске команды (процесса) на выполнение или новой оболочки shell требуется передать множество параметров, например тип терминала, вид строки приглашения, перечень каталогов для поиска программ, идентификатор родительского процесса и т. д. Все эти параметры в сумме являются окружением. Окружение определяет условия, в которых выполняются программы. При запуске подоболочки дочерний процесс наследует окружение. Параметры окружения хранятся в так называемых переменных окружения (иногда их называют переменные среды).

Некоторые переменные окружения bash 1 PATH Каталоги поиска исполняемых файлов 2 PS1 Первичное приглашение командной строки 3 PS2-PS4 Остальные приглашения командной строки 4 IFS Внутренний разделитель полей, используется для 5 HOME Домашний каталог пользователя 6 PWD Текущий каталог пользователя 7 LANG Настройки локали (например, ru_RU.UTF-8) 8 RANDOM Случайное целое в диапазоне [0-32767] 9 TMPDIR Каталог временных файлов Любой командный язык имеет свой собственный набор переменных окружения. Некоторые из них являются информационными, некоторые можно менять, присвоив переменной другое значение.

Для вывода переменных окружения используют команду set или команду env. Поскольку кроме переменных окружения set выводит еще и другие определения, то удобнее использовать конвейер set| less с возможностью прокрутки. Приведем список некоторых переменных окружения.

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

Присвоить (изменить) значение переменной окружения можно с помощью команды export, тогда оно передается дочерним оболочкам.

export PATH=$PATH:/путь/к/каталогу Можно обойтись и без использования команды export, тогда установленное значение будет доступно только в текущей оболочке. Удалить значение переменной окружения можно с помощью команды unset:

Удаление или изменение переменной окружения будут действительны только в текущей оболочке. При удалении переменной RANDOM и последующем восстановлении она теряет свои свойства случайности.

7.4. Позиционные параметры и параметры командной строки Чтобы передать сценарию shell аргументы (используемые, к примеру, в функциях скрипта), нужно перечислить их в командной строке, после имени самого сценария. Это означает задать параметры командной строки.

Переданные аргументы доступны внутри сценария через позиционные параметры, или позиционные переменные. Имена переменных соответствуют позиции аргумента в командной строке начиная с нуля. Обращаться к значению переменной нужно через символ Имя запускаемого сценария соответствует $0. Для одноцифровых номеров фигурные скобки можно опустить, если это не приведет к неоднозначности.

Пример 7. # Запуск сценария с аргументами./test.sh my_file my_str В качестве разделителя элементов командной строки интерпретатор bash использует чаще всего пробел (из переменной IFS).

В примере 7.12 позиционные переменные будут определены так:

$0 = "./test.sh", $1="my_file", $2="my_str".

7.4.1. Специальные параметры В языке shell существует набор специальных параметров переменных с помощью которых можно получить доступ, в том числе и к позиционным параметрам. Нам уже известен один такой параметр статус завершения $?. Приведем список специальных параметров, необходимых для работы с позиционными переменными:

${*} список позиционных параметров в виде одной строки (слова).

При составлении содержимого переменной ${*} bash использует для разделения параметров первый символ из переменной IFS.

При использовании необходимо заключать в двойные кавычки ${@} список позиционных параметров. Каждый параметр представляет отдельную строку (слово). При использовании необходимо заключать в двойные кавычки "${@}";

${#} количество позиционных параметров.

Внимание! Символ $ и фигурные скобки означают подстановку значения параметра (как и ранее).

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

• set сброс и установка позиционных параметров11 (с опцией • shift N сдвиг позиционных параметров на N позиций. При этом значения первых N параметров теряются.

Пример 7. # Переопределение позиционных параметров b="${*}" # сохранение поз. параметров str="a b c d" # инициализация массива set -- $str # переопределение параметров echo "${*}" # Вывод: пустая срока set -- $b # восстановление поз. параметров echo "${*}" # Вывод: my_file my_str Команда set может выполнять и другие функции.

Если после опции команды set ничего не указано, то происходит сброс позиционых параметров. Если после указаны аргументы, то набор этих аргументов будет определять новые установленные позиционные параметры.

Разберем работу команды set на примере 7.13. Мы переопределяем элементы строки str как позиционные параметры, предварительно сохранив строку с параметрами в переменной b. Пускай при запуске сценарию будут переданы два параметра my_file my_str из примера 7.12.

Если вместо строки в примере 7.13 предстоит в качестве позиционных параметров использовать элементы массива, то сначала необходимо преобразовать массив в строку. Удобнее в этом случае использовать подстановку списка значений элементов массива, см. пример 7.14.

Пример 7. # Использование списка элементов массива arr=( a b c d ) # инициализация массива arr_items="${arr[*]}" # набор элементов массива set -- $arr_items # переопределение поз. параметров Приведем еще один полезный пример использования подстановки переменных (см. п. 7.2.5). Подстановки удобно использовать для проверки существования параметра командной строки.

Пример 7. # Проверка существования позиционного параметра $ : ${1?"Порядок использования: $0 параметр"} Если второй параметр не задан, то будет выдана строка о порядке использования сценария.

7.5. Управляющие конструкции Язык shell имеет набор управляющих конструкций, которые можно разделить на категории: 1) организация ветвлений; 2) организация меню; 3) организация циклов; 4) создание функций.

Отметим основные особенности языка shell, касающиеся практически всех управляющих конструкций. Ключевые слова if, then, elif, select,..., как и команды shell, должны либо начинать строку, либо предваряться символом ; (для разделения команд). Ниже при описании синтаксиса будем использовать краткую форму записи. Однако во всех конструкциях вместо разделителя ; можно использовать перевод строки.

Управляющие конструкции, как и любой блок кода языка shell, используют стандартный поток ввода (stdin), поэтому данные в эти конструкции можно перенаправить. Благодаря этой особенности управляющие конструкции можно использовать в конвейерах (см. пример 7.19 с циклом while).

7.5.1. Оператор ветвления if Синтаксис if сп1; then сп2;[elif сп3; then сп4;]... [else спN;] fi Дополнительные ветви elif и альтернатива else могут отсутствовать.

Истинность условия. На самом деле, оператор if в языке shell немного отличается от привычных операторов if в языке Cи или Pascal.

Поскольку shell командный язык, то вместо настоящего условия после ключевого слова if стоит список команд (см. § 5). Он может содержать команды проверки условий, такие как test или [.

Сам по себе оператор if не умеет выполнять операции сравнения.

Команды из сп2 выполняются, если код возврата последней команды сп1 равен нулю. Аналогично, команды из сп4 выполняются, если код возврата последней команды в сп3 равен нулю и т. д.

Код возврата всей конструкции равен коду возврата последней выполненной команды.

7.5.2. Проверка условий test Команда test это встроенная команда bash для проверки условий, выполняющая строковые, числовые, файловые проверки. Аргументом команды test является условное выражение shell (см. таблицу 7).

Синтаксис У команды test есть альтернатива команда [ (именно команда, а не ключевое слово или оператор). Обратите внимание, что после символа [ стоит пробел. И это вполне логично. Согласно правилам shell, выражение передается команде [ в качестве параметра и отделяется от имени команды пробелом. Что касается закрывающей скобки, то по правилам языка ее можно не ставить, однако последние версии интепретатора bash требуют присутствия закрывающей скобки (опять же через пробел, как параметр).

Внимание! Оператор if часто применяется в связке с командой [, поэтому некоторые ошибочно принимают квадратные скобки за правило оформления условия в if это не так. Условие в if это список команд сп1. Квадратные скобки это аналог команды test.

Сложные выражения. Выражение для test может быть составным, допустимы следующие конструкции:

1) ( выражение ) подвыражение;

2) ! выражение инверсия;

3) выр1 -a выр2 конъюнкция (И);

4) выр1 -o выр2 дизъюнкция (ИЛИ).

Код возврата команд test и [ равен либо 0 (успех), либо 1, в зависимости от выполнения условия.

Пример 7. # Проверка имени пользователя if [ ${name} != pupkin ] then echo Oh, no! It\'s not me!

7.5.3. Организация меню case Синтаксис case слово in шаблон|... ) сп;;... esac Условие выполнения. При нахождении первого соответствия слова одному из шаблонов выполняется соответствующий список команд сп.

Как правило, в качестве слова используется подстановка значения какой-либо переменной, соответствие которой нужно будет найти среди шаблонов и выполнить указанный список команд.

Пример 7. # Выбор в зависимости от аргумента командной строки case ${1} in esac # Варианты ввода Шаблоны. В качестве шаблона можно использовать любые подстановки, в том числе подстановки параметров, команд, арифметические подстановки. Шаблон * соответствует ветви по умолчанию (если слово не совпало ни с одним шаблоном).

Код возврата всей конструкции равен коду возврата последней выполненной команды в списке. Если ни один шаблон не подошел, то код возврата равен нулю.



Pages:     || 2 |

Похожие работы:

«2 Содержание Пояснительная записка Тематический план Вопросы для подготовки к вступительным испытаниям Учебно-методическое и информационное обеспечение дисциплины. 8 Приложение 1. Контрольно-измерительные материалы вступительных испытаний Приложение 2. Ключи к контрольно измерительным материалам. 30 3 Пояснительная записка Дисциплина Философия является обязательной в структуре социально-гуманитарной подготовки будущих выпускников бакалавров. Это означает, что обучение в вузе не должно...»

«Учреждение образования Белорусский государственный технологический университет УТВЕРЖДАЮ Проректор по учебной работе БГТУ _ А.С. Федоренчик _ 2010 г. Регистрационный № УД-/р. ЭКОНОМИКА И УПРАВЛЕНИЕ ИННОВАЦИЯМИ Учебная программа для специальности 1-25 01 07 Экономика и управление на предприятии Инженерно-экономический факультет Кафедра экономики и управления на предприятиях Курс IV Семестр 8 Лекции — 51 час Практические занятия — 34 часа Экзамен 8 семестр Всего аудиторных часов по дисциплине —...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ УНИВЕРСИТЕТ МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ОФОРМЛЕНИЮ КУРСОВЫХ И ДИПЛОМНЫХ РАБОТ для подготовки специалистов по специальностям 230102 Автоматизированные системы обработки информации и управления, 080801 Прикладная информатика (в экономике), направлению 080800 Прикладная информатика УФА 2011 1 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ ГОСУДАРСТВЕННОЕ...»

«Пределы роста. 30 лет спустя. Донелла Медоуз, Йорген Рандерс, Деннис Медоуз. Учебное пособие для ВУЗов. Москва. ИКЦ АКАДЕМКНИГА.2007. 342 стр. Перевод – Е.С.Оганесян. Конспект – С.И.Забелин СПЕЦИАЛЬНОЕ ПРЕДИСЛОВИЕ. Я рад, что эта книга может быть опубликована на русском языке, поскольку россияне самым непосредственным образом участвовали в нашем проекте с момента его начала более чем 35 лет назад. Джермен Гвишиани был одним из учредителей Римского клуба, сформулировавшего задачу и оказавшего...»

«НАТЮРМОРТ ИЗ ГЕОМЕТРИЧЕСКИХ ПРЕДМЕТОВ РИСУНОК Иваново 2009 Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования ИВАНОВСКАЯ ГОСУДАРСТВЕННАЯ ТЕКСТИЛЬНАЯ АКАДЕМИЯ (ИГТА) Кафедра конструирования швейных изделий НАТЮРМОРТ ИЗ ГЕОМЕТРИЧЕСКИХ ПРЕДМЕТОВ Методические указания к выполнению лабораторной работы по курсу Рисунок для студентов специальности 260902 Конструирование швейных изделий дневной и заочной форм обучения Иваново Настоящие...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ СОЦИОЛОГИЧЕСКИЙ ГЛОССАРИЙ Учебно-методические указания в помощь студенту (материалы для подготовки к тестированию) Иркутск 2012 УДК 316 (03) ББК 60.5 С 69 Рекомендовано к изданию редакционным советом ИрГУПС Составители: Струк Е.Н., доцент кафедры ФиСН; Третьяков В.В., доцент кафедры ФиСН. Рецензенты: Бутакова Д.А., канд. социол. наук, доцент кафедры социологии и социальной работы...»

«МЕЛИОРАЦИЯ: ЭТАПЫ И ПЕРСПЕКТИВЫ РАЗВИТИЯ Материалы международной научнопроизводственной конференции Москва 2006 РОССИЙСКАЯ АКАДЕМИЯ СЕЛЬСКОХОЗЯЙСТВЕННЫХ НАУК Государственное научное учреждение Всероссийский научно-исследовательский институт гидротехники и мелиорации имени А.Н.Костякова МЕЛИОРАЦИЯ: ЭТАПЫ И ПЕРСПЕКТИВЫ РАЗВИТИЯ Материалы международной научно-производственной конференции, посвященной 40-летию начала осуществления широкомасштабной программы мелиорации Москва 2006 УДК 631.6 М 54...»

«Уважаемые выпускники! В перечисленных ниже изданиях содержатся методические рекомендации, которые помогут должным образом подготовить, оформить и успешно защитить выпускную квалификационную работу. Рыжков, И. Б. Основы научных исследований и изобретательства [Электронный ресурс] : [учебное пособие для студентов вузов, обучающихся по направлению подготовки (специальностям) 280400 — Природообустройство, 280300 — Водные ресурсы и водопользование] / И. Б. Рыжков.— Санкт-Петербург [и др.] : Лань,...»

«СРЕДНЕЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАНИЕ Г.Ф. Быстрицкий Общая энергетика Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов образовательных учреждений среднего профессионального образования Рекомендовано Учебно-методическим советом Института электротехники МЭИ (ТУ) в качестве учебного пособия для студентов электротехнических специальностей вузов по направлению обучения Электротехника, электромеханика и электротехнологии кнОрУС • МОСкВа • 2013 УДК...»

«Указатель литературы, поступившей в библиотеку Муромского института в 2005 году Библиотека МИ Муром 2006 г. СОДЕРЖАНИЕ ОБРАЗОВАНИЕ. СОЦИАЛЬНАЯ РАБОТА ИСТОРИЯ. КУЛЬТУРОЛОГИЯ. ПОЛИТИЧЕСКИЕ НАУКИ. СОЦИОЛОГИЯ. ФИЛОСОФСКИЕ НАУКИ. ПСИХОЛОГИЯ.. 4 ЭКОНОМИКА. ЭКОНОМИЧЕСКИЕ НАУКИ. ОРГАНИЗАЦИОННОЕ ПРОИЗВОДСТВО И ПЛАНИРОВАНИЕ. ТЕХНИКА БЕЗОПАСНОСТИ ГОСУДАРСТВО И ПРАВО ЯЗЫКОЗНАНИЕ ЕСТЕСТВОЗНАНИЕ. МАТЕМАТИКА. ФИЗИКА. ХИМИЯ. БИОЛОГИЯ. ЭКОЛОГИЯ АВТОМАТИКА. КИБЕРНЕТИКА. ИНФОРМАТИКА. ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ, МЕХАНИКИ И ОПТИКИ А. В. Кириленко ОСНОВЫ ИНФОРМАЦИОННОЙ КУЛЬТУРЫ. БИБЛИОГРАФИЯ Выпуск 1 Учебное пособие Под редакцией Е. Г. Расплетиной Санкт-Петербург 2008 УДК 01 Кириленко А. В. Основы информационной культуры. Библиография. Вып. 1: учеб. пособие / А. В. Кириленко; под ред. Е. Г. Расплетиной. – СПб. : СПбГУ ИТМО, 2008. - 156 с. В...»

«СМОЛЕНСКИЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ Городниченко Эдуард Александрович ФИЗИОЛОГИЯ ПИТАНИЯ Учебно-методическое пособие (для студентов заочной формы обучения, обучающихся по специальности 260501.65 Технология продуктов общественного питания) Смоленск, 2008 1. СОДЕРЖАНИЕ УЧЕБНОЙ ДИСЦИПЛИНЫ Тема 1. Основы физиологии человека Лекция 1. Онтогенетические закономерности формирования организма человека. Механизмы регуляции физиологических функций. Обмен веществ и энергии – основа жизнедеятельности...»

«Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ А. В. Неверов ЭКОНОМИКА ПРИРОДОПОЛЬЗОВАНИЯ Рекомендовано учебно-методическим объединением высших учебных заведений Республики Беларусь по образованию в области природопользования и лесного хозяйства в качестве учебно-методического пособия для студентов высших учебных заведений специальности 1-57 01 01 Охрана окружающей среды и рациональное использование природных ресурсов Минск 2009 УДК 502.171:33(075.8) ББК 65.28я73...»

«СМОЛЕНСКИЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ ФАКУ ЛЬТЕТПСИХОЛОГИИ И ПР АВА ОТДЕЛЕНИЕ ПР АВА КАФЕДР А УГОЛОВНОГО ПР АВАИ ПРОЦЕССА ПР АВООХР АНИТЕЛЬНЫЕОРГ АНЫ Учебно-методическое пособие (для студентов, обучающихся по специальности 030501.65 (021100) Юриспруденция – заочная форма обучения) Смоленск – 2009 2 Составитель – старший преподаватель кафедры уголовного права и процесса Подберезко Д.В. Рецензент: старший преподаватель Смоленского филиала Московского университета МВД России, к.ю.н. Куликова О.Н. 3...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное образовательное учреждение высшего профессионального образования ШУЙСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра теории и методики физической культуры и спорта УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС по дисциплине АНАТОМИЯ И ФИЗИОЛОГИЯ РЕБЕНКА для специальности 050720.65 - Физическая культура со специализацией Физическое воспитание в дошкольных учреждениях Составитель: Воробушкова М.В., доктор медицинских наук, профессор Шуя,...»

«Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТУРИЗМА И СЕРВИСА (ФГБОУ ВПО РГУТиС) Институт туризма и гостеприимства (г.Москва) филиал Кафедра организации и технологии в туризме и гостиничной деятельности ДИПЛОМНАЯ РАБОТА на тему: Разработка рекомендаций по внедрению программ майс – туризма на предприятиях на примере ООО Майс Групп по...»

«Рабочая программа по биологии. 8 класс. Базовый уровень. РАБОЧАЯ ПРОГРАММА по биологии, 8 класс 2 часа в неделю, 68 часов. Учебник В.В. Пасечник, А.А. Каменский. Биология, 8 класс. М.: Просвещение,2012г. Программа: Биология. 5-11 классы: программы для общеобразовательных учреждений к комплекту учебников, созданных под руководством В. В. Пасечника/авт.-сост. Г. М. Пальдяева.-2-е изд., стереотип.-М.: Дрофа, 2010. Методическое обеспечение программы 1. Н.В.Дубинина, В.В.Пасечник. Тематическое и...»

«Т.А. Круглякова, М.Б. Елисеева КУЛЬТУРА РЕЧИ: сборник упражнений Методическое пособие к практическим занятиям Допущено учебно-методическим объединением по направлениям педагогического образования в качестве учебного пособия для студентов по дисциплине Культура речи Санкт-Петербург 2010 УДК 81.2 Круглякова, Т.А., Елисеева, М. Б. Культура речи : сборник упражнений. — СПб. : Златоуст, 2010. — 172 с. Научный редактор: д.ф.н., проф. С.Н. Цейтлин Рецензент: д.ф.н., проф. С.Я. Гехтляр Зав. редакцией:...»

«Пояснительная записка Рабочая программа по немецкому языку для 2 класса разработана на основе нормативных и инструктивно-методических документов Министерства образования и науки Российской Федерации, департамента образования Белгородской области, БелИРО: - ФГОС начального общего образования (ФГОС НОО) Федерального компонента государственного стандарта общего образования. - Примерных программ по учебным предметам. Начальная школа. Часть 2: Иностранные языки (серия Стандарты второго поколения).-...»

«Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Горно-Алтайский государственный университет ПРАВИЛА НАПИСАНИЯ И ОФОРМЛЕНИЯ ВЫПУСКНЫХ КВАЛИФИКАЦИОННЫХ РАБОТ (2-е изд., перераб. и дополн.) Горно-Алтайск РИО Горно-Алтайского госуниверситета 2014 Печатается по решению редакционно-издательского совета Горно-Алтайского государственного университета ББК74.58 П68 ПРАВИЛА НАПИСАНИЯ И ОФОРМЛЕНИЯ...»










 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.