- •1.4 Структура операционных систем
- •1.4.1 Монолитная система
- •1.4.2 Многоуровневая структура ос
- •1.4.3 Модель экзоядра
- •1.4.4 Микроядерная архитектура (модель клиент-сервер)
- •1.4.5 Обобщение сравнения моделей
- •Интерфейс пользователя
- •Команды
- •Командная строка
- •Договоренности о формате командной строки
- •C.5.4. Переназначение потоков.
- •C.5.5. Переназначение стандартного потока ошибок (в unix).
- •C.5.6. Перенаправление потока ввода.
- •C.5.7. Конвейерная обработка.
- •Управление потоком выполнения
- • Стандартный ввод/вывод
- •Диагностика и другие виды вывода
- •Командные строки и конвейеры
- •Специальные символы
- •8.2.1. Запуск команды в фоновом режиме (символ &)
- •8.2.2. Последовательное выполнение команд (символ ;)
- •8.2.4. Отмена специального значения (метасимвол кавычки)
- •8.2.4.1. Использование кавычек для отмены значения символа пробел
- •Использование кавычек
- •Окружение
- •Переменная окружения
- •Взаимодействие процессов посредством окружения
- •Переменные Shell
- •Позиционные параметры
- •Файловая система
- •Структура файловой системы
- •Монтируемые файловые системы
- •Интерфейс с файловой системой
- •Разновидности файлов
- •Обычные файлы
- •Файлы-каталоги
- •Специальные файлы
- •Связывание файлов с разными именами
- •Именованные программные каналы
- •Файлы, отображаемые в виртуальную память
- •Синхронизация при параллельном доступе к файлам
- •Процессы
- •Процессы
- •Атрибуты процесса
- •Идентификатор процесса (pid)
- •Идентификатор родительского процесса (ppid)
- •Поправка приоритета (ni)
- •Терминальная линия (tty)
- •Реальный (uid) и эффективный (euid) идентификаторы пользователя
- •Реальный (gid) и эффективный (egid) идентификаторы группы
- •Атрибуты файлов
- •Порождение процессов в Linux
- •Управление процессами
- •Типы процессов
- •Права доступа к файлам и каталогам
- •Жизненный цикл процесса в unix и основные системные вызовы
- •Контекст процесса
- •Приоритеты процессов
- •Создание процесса
- •Сон и пробуждение
- •Завершение выполнения процесса
- •Получение информации о процессах
- •Управление приоритетом процессов
- •Сигналы: посылка и обработка
- •Доставка и обработка сигнала
- •Основные сигналы
- •Посылка сигналов
- •Сигналы, посылка сигналов, команда kill
- •Приоритет выполнения процесса, команда nice
- •Текущий контроль процессов, команды ps и top
- •Защита фоновых процессов, команда nohup
- •Пользователь
- •. Привилегированный пользователь
- •Управление пользователями и правами доступа База данных пользователей системы
- •Изменение базы данных пользователей
- •Изменение прав доступа
- •Ограничения сеанса пользователя
- •Команды архивирования файлов
- •4.7.1. Программа tar
- •4.7.2. Программа gzip
- •4.7.3. Программа bzip2
- •Команды поиска grep и find
- •5.5. Перенаправление ввода/вывода, каналы и фильтры
- •5.5.2 Оператор |
- •5.5.3 Фильтры
- •Сигналы
- •Приложение. Список реентерабельных функций
- •Регистрация системных сообщений, система syslog
- •Конфигурационный файл демона syslogd
- •Info Информационные сообщения
- •Учет продолжительности соединений
- •Пользователи и группы
- •Файл /etc/passwd
- •Файл /etc/group
- •Файл /etc/shadow
- •Системные регистрационные имена
- •Изменение действующего идентификатора пользователя
- •Изменение действующего идентификатора группы
- •Изменение пароля и характеристик учетной записи, связанных с регистрацией
- •Правила построения паролей
- •Действие команды passwd
- •Устаревание паролей
- •Показ атрибутов пароля
- •Стандартные значения атрибутов
- •Просмотр базы данных учетных записей
- •Получение списка зарегистрировавшихся пользователей
- •Средства создания, изменения и удаления учетных записей пользователей
- •Средства создания, изменения и удаления групп
Использование кавычек
Имеется несколько символов, которые имеют в Shell специальное значение. Это <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (') или двойные (") кавычки. То же действие в отношении одиночного символа выполняет обратная наклонная черта (\). (Обратные одинарные кавычки (`) используются только для командной подстановки в Shell и не отменяют специальных значений символов.) Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:
echostuff='echo $? $*; ls *| wc' |
только присваивает переменной echostuff значение
echo $? $*; ls *| wc |
но не вызывает выполнение ни одной из команд. Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это$, \, ` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение. Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется до полнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа. Благодаря этому можно продлевать командную строку. Ниже приводятся несколько примеров использования кавычек:
|
9.Среда окружения в UNIX,управление средой через переменные
Окружение
Как уже говорилось, многие абстракции языка программирования доработаны в shell так, чтобы служить средством связывания и взаимодействия процессов с системой и друг с другом. Например, абстракция переменная превращается в понятие переменная окружения (environment variable).
Переменная окружения
С одной стороны, переменная окружения - обыкновенная строковая переменная, в которой кто угодно может хранить какие угодно значения; ее даже и описывать не надо:
$ One=U; Three=Zzz
$ echo Example 1: $One $Two $Three
Example 1: U Zzz
$ echo "Example 2: $One $Two $Three"
Example 2: U Zzz
$ echo 'Example 3: $One $Two $Three'
Example 3: $One $Two $Three
Из первого примера видно, что сам факт присваивания объявляет переменную, а содержимое необъявленной переменной просто считается пустым (напомним, что команда echo выводит все параметры командной строки, разделяя их пробелом). Как показывают второй и третий примеры, подстановка значения переменной (операция $имя_переменной ) продолжает работать, если текст заключен в двойные кавычки, и не работает, если используются одинарные. По договоренности (см. главу 7) закавыченный текст передается как один параметр командной строки. Теперь очевидно, что подстановку shell делает до вызова команды; только этим можно объяснить, почему в первом примере echo выводит один пробел между U и Zzz: она получаетчетыре параметра ( Example 1: U и Zzz ), разделенные цепочками пробелов.
Несмотря на то что переменные в shell - строкового типа, легко организовать арифметические операции над ними: если содержимое переменной нельзя интерпретировать как число, арифметическая операция завершается с ошибкой. Арифметика встроена почти во все виды командных интерпретаторов (см. "Сравнительную таблицу командных интерпретаторов"), однако, к сожалению, в каждом это сделано слегка по-своему. Наиболее распространена арифметическая подстановка (arithmetic expansion), при которой shellвычисляет строки вида $((арифметическое выражение)). Есть надежда, что арифметическая подстановка с целыми числами в версии современного BSD- sh или Linux- ash будет работать и в остальных командных интерпретаторах гнезда Bourne:
$ A=7; b=3; echo $(($A*$b))
21
В примере, описывающем понятие сценария, мы видели, как в shell устроен механизм передачи параметров командной строки. Все просто: первый параметр попадает внутри сценария в переменную с именем 1 ( подстановка значения этой переменной выглядит как $1 ), второй - в переменную с именем 2 и т. д., пока есть параметры в командной строке. Имя самого сценария передается в переменной 0 в точности так, как мы его вызвали. Количество переданных параметров подставится вместо $# (напомним, что по американской традиции этот символ используется вместо нашего No). Все параметры командной строки подставляются вместо $*или $@ (Какая между этими формами разница? RTFM!)
Столь простая схема передачи параметров - явная доработка языка в сторону средств интеграции: чаще всего небольшой сценарий - это некоторая составная пользовательская команда, связывающая несколько утилит, и чтобы она не была одноразовой, ей наверняка придется уметь обрабатывать командную строку.