- •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
- •Устаревание паролей
- •Показ атрибутов пароля
- •Стандартные значения атрибутов
- •Просмотр базы данных учетных записей
- •Получение списка зарегистрировавшихся пользователей
- •Средства создания, изменения и удаления учетных записей пользователей
- •Средства создания, изменения и удаления групп
Взаимодействие процессов посредством окружения
С другой стороны, переменная окружения - удобное и простое средство управления системой и утилитами. Не один толькокомандный интерпретатор, но и любой процесс в системе имеет так называемое окружение (environment), которое состоит из пар "имя=значение". Окружение создает система, копируя окружение процесса-родителя. Потомок волен делать со своей копией что угодно: изменять значения переменных, заводить новые, удалять и т. п., на окружении родителя это никак не отразится. Спеременными окружения можно передавать важную информацию. Отличие от параметров командной строки заключается в том, что переменную достаточно изменить или задать один раз, и пока она изменена, по-другому будет работать и чувствительная к ней утилита. С точки зрения shell его собственные переменные и есть переменные окружения.
Например, утилита ls использует переменную окружения COLUMNS, в которой хранится наибольшая допустимая ширина текста. Можно обычным присваиванием изменить значение этой переменной, и ls примет его к сведению:
$ echo $COLUMNS
$ ls
Makefile myscript uzor.c
fhs-2.2-source.tar.gz o.ps
$ COLUMNS=60
$ ls
Makefile o.ps
fhs-2.2-source.tar.gz uzor.c
myscript
Многие программы используют переменную EDITOR, содержащую имя текстового редактора: если понадобится что-нибудь редактировать, они запустят именно его. Переменная HOME содержит путь к вашему домашнему каталогу, в TERM хранится тип терминала, в LOGNAME - входное имя пользователя. Переменная PATH используется самим shell для поиска утилиты, если имя команды не совпадает с именами ни одной из встроенных команд. В PATH перечислены каталоги, в которых shell будет утилиту искать. Кстати сказать, именно потому, что в переменной PATH обычно нет текущего каталога (путь " ." не включен в список), в одном из приведенных выше примеров мы были вынуждены явно указывать его в виде ./myscript. Помещать " ." в PATHнебезопасно: кто может знать, не окажется ли в текущем каталоге исполняемый файл с именем, скажем, ls, и кто может знать, что на самом деле этот файл будет делать при запуске?
Список определяемых переменных окружения велик, его выдает команда set. Желающих узнать, какими переменными окруженияпользуется та или иная утилита, мы отсылаем к ее руководству, раздел ENVIRONMENT VARIABLES.
Сам shell пользуется многими переменными окружения. Например, строка-подсказка (то, при виде чего пользователь захочет ввести очередную команду в командной строке) хранится в переменной PS1 (Если есть PS1, то должно быть PS2, а может, и PS3, иPS4. Для чего они? RTFM!). Поначалу в этой переменной хранилась строка " $ " для обычного пользователя и " # " для суперпользователя. Потом решили использовать PS1 для вывода кое-какой полезной информации: имени компьютера, имени пользователя, даты входа в систему или прочей относительно статической информации. Это просто, достаточно написать что-то вроде:
$ echo $PS1
$
$ PS1="`logname`@`hostname`> "
george@book.altlinux.ru>
george@book.altlinux.ru>
Однако статическая информация - не самое полезное в работе. Гораздо интереснее держать в PS1, скажем, путь к текущему каталогу или точное время. Сменился текущий каталог - изменилась PS1. Сам shell изменять PS1 не будет, значит, надо его доработать. Первый способ доработки - научить его выполнять определенную последовательность команд перед тем, как выводить очередную подсказку или при смене текущего каталога (так поступили разработчики tcsh: там можно задать специальные функции precmd, cwdcmd и некоторые другие). В эту последовательность команд можно вставить команды изменения PS1. Другой вариант - считать некоторые последовательности символов в PS1 специальными и при выводе подсказки заменять их соответствующими значениями - путем, временем и т. п. Вот, например, как это делается в bash:
bash$ pwd
/usr/share/doc
bash$ PS1="[\A]\u@\h:\w> "
[17:30]george@book:/usr/share/doc>
[17:30]george@book:/usr/share/doc>
Один сценарий можно запустить из другого точно так же, как и из командной строки, и так же, как любую утилиту UNIX. Выполняться этот сценарий будет тоже стандартно: система подберет и запустит для него соответствующий интерпретатор, передаст ему строку вызова в качестве параметров и т. д. Понятно, что если в нем изменить какую-нибудь переменную окружения, родительский процесс этого не заметит. Больше того, изо всех переменных, определенных в родительском shell в окружениедочернего процесса, попадут только проэкспортированные командой export и те, что достались самому shell с окружением (отего родителя, например, от init ). Остальные переменные будут считаться локальными и никуда не перейдут. Если мы хотим вызвать из одного сценария другой так, чтобы этот другой выполнялся той же копией интерпретатора (а значит, сохранились бы все изменения в окружении ), надо использовать специальную команду " .":
$ cat changeA
A="NewA"
$ A=""
$ . changeA
$ echo $A
NewA
10.Переменные в shell их типы и операции с ними