Что такое тип сессии в linux какие типы сессий бывают чем они отличаются

Обновлено: 05.07.2024

Что такое лидеры сеансов, в ps -d которых выбираются все процессы, кроме лидеров сеансов?

В Linux каждый процесс имеет несколько идентификаторов, связанных с ним, в том числе:

Идентификатор процесса (PID)

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

ID родительского процесса (PPID)

Это просто PID процесса, который запустил данный процесс.

ID группы процессов (PGID)

Это просто PID лидера группы процессов. Если PID == PGID, то этот процесс является лидером группы процессов.

Идентификатор сеанса (SID)

Это просто PID лидера сеанса. Если PID == SID, то этот процесс является лидером сеанса.

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

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

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

Примечание. Используйте ps xao pid,ppid,pgid,sid,comm для просмотра этих идентификаторов.

Большинство процессов, вызываемых из оконного менеджера / графической среды, имеют тот же идентификатор сеанса, что и одна из программ запуска. Это позволяет ОС выполнять одну и ту же kill -HUP -$$ операцию над всеми программами: браузером, музыкальным проигрывателем, libreoffice, IM-клиентом и т. Д. Это процессы, которые не являются лидерами сеансов.

Пожалуйста, не возражайте, но мне, возможно, понадобится немного больше разъяснений - лидер сессии один, как называются другие, и как они выглядят (поведение, чем они отличаются от лидера сессии)? Мне нравится ваше объяснение, но мне все еще не хватает одного момента: IIUC, каждый раз, когда я запускаю процесс, он на самом деле является потомком оболочки, в которую я вошел (конечно, если я не отказался от нее). Почему ОС не может просто пройтись по дереву процессов и убить всех братьев и сестер этого процесса и их братьев и сестер? (На самом деле это то, о чем я всегда думал . до сегодняшнего дня: D) Так в чем же причина использования сессий? Когда графический интерфейс пользователя умирает, сигнал может получить все дерево процессов, а не группа сеансов. Два разных желаемых поведения: убить одно «приложение» (убить firefox и его плагины), а не убить все дочерние процессы (выход из графического интерфейса). Я ожидаю, что аналогичные работы с Emacs и Chrome.

Я думал, что знаю ответ на этот вопрос, но я написал программу на C, чтобы понять это.

Я скомпилировал его с cc -g -o sid sid.c помощью нескольких разных способов, чтобы увидеть, что происходит:

Я был немного удивлен тем, что Linux (2.6.39) вернул. Я также нашел справочную страницу раздела 7 «Учетные данные».

Мой совет - сделать man 7 credentials (или эквивалент, если не в Linux) и прочитать раздел о группе процессов и сеансе, чтобы узнать, сможете ли вы разобраться в этом.

Как читать и определять переменные окружения и оболочки на Linux главное изображение

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

Введение

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

Место, в котором оболочка держит пути всех этих настроек, называется окружением. Окружение — это место, которое оболочка определяет каждый раз, когда запускается сессия. В ней заключены переменные, созданные свойствами системы.

Как работает окружение и его переменные

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

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

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

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

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

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

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

Вывод переменных оболочки и окружения

Каждая сессия оболочки хранит пути своих собственных переменных и переменных окружения. Их достигнуть можно разными способами.

Можно распечатать список всех переменных окружения используя env или printenv . По умолчанию они должны делать все то же самое:

Как правило, этот вывод довольно типичен для обоих команд. Различия между ними в функциональности. Например, в printenv можно запрашивать значения определенной переменной.

С другой стороны env позволяет изменять окружение, указывая определение переменной. Например:

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

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

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

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

Вывод этой команды довольно огромен. Для удобства работы с этими переменными можно использовать пейджеры more или less .

В принципе, отсутствует особая необходимость знать все функции, определенные для bash . Поэтому — можно очистить вывод, указав, что set должен проводить операции в режиме POSIX , которые опускают отображение функций консольной оболочки. Это можно выполнить в дочерней оболочке, чтобы наше текущее окружение оставалось прежним:

Возникнет список всех определенных переменных окружения и оболочки.

Можно попробовать сравнить этот вывод с выводом команд env или printenv , тем самым получив список только переменных оболочки. Возможно, вывод будет довольно кривым:

Отображение будет до сих пор включать несколько переменных окружения, в связи с тем фактом, что set команда выводит значения в кавычках, в то время как команды printenv и env показывают значения, опуская их.

Все это должно давать правильное понимание переменных окружения и оболочки.

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

Общие переменные окружения и консольной оболочки

Некоторые переменные окружения и оболочки очень полезны и к ним часто обращаются. Здесь перечислены общие переменные окружения, которые зачастую используются:

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

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

USER: имя текущего пользователя оболочки.

PWD: переменная отображает значение текущей рабочей директории.

OLDPWD: предыдущая рабочая директория. Оболочка держит эту переменную для обратного переключения, когда запускается команда cd - .

LS_COLORS: определяет цвет кодов, которые используются для вывода команды ls . Чтобы различать типы файлов и директорий.

MAIL: отображает электронную почту текущего пользователя.

PATH: список директорий, которые будет проверять система, когда будет идти обращение к той или иной команде. Когда пользователь вводит команду, система смотрит указанные директории, в последовательном порядке.

LANG: текущий язык и локализационные настройки, включая кодировку символов.

HOME: текущая домашняя директория пользователя.

_: отображает вывод последней запущенной команды.

В дополнение к этим переменным окружения, имеются некоторые переменные оболочки, которые также будут часто встречаться:

BASHOPTS: список опций, которые используются при запуске bash . Это может быть полезно для выяснения, каким конкретно способом будет оперировать консольная оболочка.

BASH_VERSION: отображает конкретную версию bash .

BASH_VERSINFO: мажорная версия bash .

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

DIRSTACK: директории, которые доступны для команд pushd и popd .

HISTFILESIZE: количество линий, хранящиеся в файле истории набранных команд.

HISTSIZE: количество линий, которые можно хранить в памяти.

HOSTNAME: имя компьютера системы на данный момент.

IFS: внутренний разделитель поля в командной строке. По умолчанию — это пробел.

PS1: строка приглашения на ввод. Эта переменная используется для того, чтобы определить, как будет выглядеть эта строка. Еще есть вторая строка PS2 которая используется, когда команда многострочная.

SHELLOPTS: опции оболочки, которые можно определять с помощью команды set .

UID: идентификатор текущего пользователя.

Установка переменных окружения и оболочки

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

Создание переменной оболочки

Определение этой переменной будет происходить в пределах текущей сессии консольной оболочки.

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

Определенная выше переменная теперь доступна в текущей сессии, но в дочернем процессе она будет отсутствовать. Увидеть ее можно при помощи команды grep на вывод set :

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

Чтобы получить значение той или иной переменной, используется следующая конструкция:

Команда echo делает вывод введенной строки как аргумента. Но, в данном случае применяется знак $ , в совокупности с ключом переменной, который возвращает ее значение.

Создание переменной окружения

Чтобы обернуть созданную переменную оболочки в переменную окружения, можно ее экспортировать:

Если создать новую дочернюю сессию, то можно увидеть, что в ней также существует эта переменная:

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

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

Отвязка переменный

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

Теперь, если посмотреть в окружение, то удаленная переменная там будет отсутствовать.

При этом она до сих пор существует в переменной оболочки:

Если возникает потребность окончательно сделать отвязку переменной из оболочки и окружения, то можно применить команду unset :

Проверить результат команды можно с помощью echo :

Отсутствует какое-либо возвращаемое значение, потому что переменная была отвязана.

Установка переменных окружения по логину

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

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

Различие между логин, не-логин, интерактивной и не-интерактивной сессией оболочки

Bash оболочка читает различные конфигурационные файлы в зависимости от того, какая сессия запущена.

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

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

Помимо этих типов сессий, существуют интерактивный и не-интерактивный подход. Первый прикрепляется к терминалу, второй же — наоборот.

Таким образом сессии оболочки могут различаться по этим двум типам.

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

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

Логин сессия при запуске в первую очередь будет читать конфигурационные заявления из файла /etc/profile . Затем она будет смотреть данные в первом конфигурационном файле и пользовательской домашней директории, чтобы получить особые настройки пользователя.

Читаются исключительно файлы, которые располагаются в

В не-логин сессии оболочка читает файл /etc/bash.bashrc и пользовательский

/.bashrc файл для построения своего окружения.

Не-интерактивные оболочки читают переменную окружения под названием BASH_ENV и читают указанный файл, чтобы определить новое окружение.

Реализация переменных окружения

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

Это обеспечивает гибкость, которая может помочь в особых ситуациях, где будут необходимы конкретные настройки для логин и не-логин оболочки. Хотя, обычно, настройки одинаковы в обоих ситуациях.

Большинство Linux-дистрибутивов производят конфигурацию файлов к источнику не-залогиненых конфигурационных файлов. Это значит, что можно определять окружение переменных внутри них. И они будут прочитаны в обоих случаях.

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

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

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

Если необходимо установить системные переменные, то можно добавить их в /etc/profile , /etc/bash.bashrc или /etc/environment .

Заключение

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

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

когда я запускаю команду "w", я вижу, что два пользователя вошли в систему (оба-я). Быстрый поиск здесь говорит о том, что это нормально, потому что "один пользователь может иметь несколько активных сессий одновременно."

Что такое сессия? Почему у меня их два, если я вошел в систему только один раз?

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

в большинстве Linux вкусов, оболочка по умолчанию bash и новая bash сессия будет запускаться каждый раз при открытии нового терминала. В выводе w вы выложили, вы похоже, ваш графический сеанса (похоже ты sshing о машине):

несколько эмуляторов открытых терминалов:

и вы также, кажется, вошли в систему с неграфического tty:

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

Я думаю, что каждый сеанс терминала является сеансом пользователя. Вы можете иметь более одного терминала под X, и это виртуальные терминалы, или u может иметь реальный терминал под консолью. Это все сеансы. Это мой 'w'

второй столбец показывает tty, так как вы можете видеть, что pts - это xterm (виртуальный терминал), другой (tty2) - это консольный логин.

сеанс-это каждая терминальная оболочка, запущенная процессами пользователя. Например, у меня сейчас запущено 3 сеанса. Окружение рабочего стола партнера и два окна терминала.

1. Хотя пользователь войти в один процесс (оболочка, которая является их интерфейс командной строки), пользователи в конечном итоге работает много процесса в результате действия, как:

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

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

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

4. Также обратите внимание на закрытие терминала, нажав кнопку " x " не делают вас из этого терминала. Что терминал продолжает работать в фоновом режиме. Если вы хотите, чтобы по сессии из терминала, вы должны выйти оттуда, нажав CTRL + D или exit.

5. При выходе из терминала ядро посылает сигнал SIGHUP (аналогично kill -1) для обработки это сессионный лидер. Теперь любой другой процесс, запущенный в терминале, является дочерним для данного лидера сессии. Эти дочерние процессы сформировали группы процессов, которые управляются этим процессом лидера сеанса (родительским процессом).

6. Процесс лидера сеанса отправляет SIGHUP каждому дочернему процессу, некоторый процесс завершается, в то время как некоторые могут не завершаться(приостановленные или работающие в фоновом режиме). Те выбирают не прекратить осиротеть как overs встречи и немедленно принятый мимо init процесс (родитель всех процессов в linux машине).



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

$ fortune
No amount of careful planning will ever replace dumb luck.

(приложение fortune может быть не установлено, запустите установку в пакетном менеджере вашего дистрибутива, например apt-get install fortune — прим. пер.)

.bash_profile

Теперь давайте сделаем так чтобы fortune запускалось при каждой авторизации. Используя любимый текстовый редактор отредактируйте файл .bash_profile в вашей домашней директории. Если такого файла не существует, создайте его. Вставьте в его начало:

fortune

Попробуйте выйти из системы и зайдите обратно. До запуска менеджера дисплея, такого как например xdm, gdm или kdm, вы увидите веселое приветствие, когда войдете:

Оболочка входа.

При запуске bash проходит файл .bash_profile в вашей домашней директории, запуская каждую строчку как будто набирая ее в командной строке. Это называется интерпретацией файла (file sourcing).

Bash может работать различным образом в зависимости от того, как он запущен. Если он запущен как оболочка входа, то будет работать, как описано выше — сначала обработая общесистемный /etc/profile, а затем ваш личный

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

$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
chouser 404 0.0 0.0 2508 156 tty2 S 2001 0:00 -bash

Вы, вероятно, увидите более длинный список, но но в нем будет как минимум одна строка с чертой перед именем вашей оболочки, как -bash в примере выше. Эта черта используется оболочкой, чтобы определить, была ли она запущена при авторизации.

Понимание --login

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

После авторизации можно запустить много копий вашей оболочки. У тех из них которые запущены без опции --login или не имеют черточки перед именем процесса, поведение будет иным нежели при запуске с авторизацией. Они предоставляют вам командную строку, однако, называются они интерактивными оболочками. Если bash запущена интерактивно, без авторизации, она проигнорирует /etc/profile и

/.bash_profile вместо этого обработает

Проверка на интерактивность

/.bashrc не будучи запущенным интерактивно, например при использовании команд типа rsh или scp. Это важно помнить потому как вывод текста, как в примере с командой fortune выше, может испортить эти неинтерактивные сессии bash. Хорошей идеей является использование переменной PS1 для проверки факта интерактивности текущей сессии перед выводом текста:

/etc/profile и /etc/skel

Как системный администратор, вы отвечаете за файл /etc/profile. Так как им руководствуются все кто впервые входят в систему, важно держать его в рабочем состоянии. Это также очень мощный инструмент, используемый для того чтобы заставить вещи работать правильно для новых пользователей сразу после того как они войдут используя свою новую учетную запись.

Однако, существует вариант, при котором, настройки с одной стороны, могут быть выставлены в значения по-умолчанию для новых пользователей, а с другой, могут быть легко ими изменены при необходимости. Как раз для этого и существует директория /etc/skel. При использовании команды useradd для создания новой учетной записи, все файлы из /etc/skel копируются в домашний каталог нового пользователя. Это означает, что вы можете положить, например, .bash_profile и .bashrc в /etc/skel для более комфортного начала работы нового пользователя.

export

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

$ export
declare -x EDITOR="vim"
declare -x HOME="/home/chouser"
declare -x MAIL="/var/spool/mail/chouser"
declare -x PAGER="/usr/bin/less"
declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/chouser/bin"
declare -x PWD="/home/chouser"
declare -x TERM="xterm"
declare -x USER="chouser"

Экспортирование переменных

Если переменная не отмечена на экспорт, её значение не будет задано для новых запускаемых оболочек. Но вы можете отметить переменную на экспорт, передав её встроенной команде export:

$ FOO=foo
$ BAR=bar
$ export BAR
$ echo $FOO $BAR
foo bar
$ bash
$ echo $FOO $BAR
bar

В этом примере были заданы обе переменные FOO и BAR, но только BAR была помечена для экспорта. Когда был запущен новый bash он потерял значение переменной FOO. Если вы выйдите из этого нового bash, вы увидите что первоначальные значения обоих переменных FOO и BAR не изменились.

$ exit
$ echo $FOO $BAR
foo bar

Export и set -x


В связи с вышеописанным поведением, переменные могут быть указаны в

/.bash_profile или /etc/profile и помечены для экспорта, для того, чтобы в дальнейшем не было необходимости указывать их снова. Но есть несколько опций которые не могут быть экспортированы, и поэтому они должны быть заданы в

/.bashrc и в вашем профиле последовательно. Эти опции настраиваются при помощи встроенной команды set:

$ set -x

Опция -x заставляет bash вывести на экран каждую команду, которую он собирается выполнить:

$ echo $FOO
$ echo foo
foo

Это может быть очень полезно для понимания непредвиденного поведения команд при использовании кавычек или похожих странностей. Чтобы выключить опцию -x, используйте set +x. Обратитесь к странице документации man за всеми опциями встроенной команды set.

Установка переменных с «set»

Команда set может также использоваться для задания значений переменных, но при этом указание самой этой команды не является обязательным. Команда в bash «set FOO=foo» делает то же самое, что и «FOO=foo». Сброс значения переменной осуществляется встроенной unset:

$ FOO=bar
$ echo $FOO
bar
$ unset FOO
$ echo $FOO

Unset vs. FOO=

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

$ FOO=bar
$ set | grep ^FOO
FOO=bar
$ FOO=
$ set | grep ^FOO
FOO=
$ unset FOO
$ set | grep ^FOO

Использование set без параметров похоже на использование встроенной команды export за исключением того, что set отображает все переменные, а не только обозначенные как внешние.

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

Часто поведение команд можно изменить установкой переменных окружения. Так же, как в случае новых сессий bash, запускаемые программы из вашей командной строки будут видеть только переменные окружения, помеченные на экспорт. Например, команда man проверяет переменную PAGER, чтобы выяснить какую программу использовать для постраничного просмотра текста.

$ PAGER=less
$ export PAGER
$ man man

Когда переменная PAGER установлена в less, вы будете видеть сначала одну страницу, а нажатие пробела будет перемещать вас а следующую страницу. Если вы измените переменную PAGER в cat, то весь текст отобразится сразу, без остановок на страницах.

$ PAGER=cat
$ man man

Использование «env»

К сожалению, если вы позабудете установить PAGER обратно в less, программа man (как и некоторые другие программы) будет продолжать вывод весь запрошенный текст без остановок. Если вы хотели задать PAGER значение cat только на один раз, то могли бы воспользоваться командой env:

$ PAGER=less
$ env PAGER=cat man man
$ echo $PAGER
less

В этом примере переменная PAGER была использована со значением cat в программе man, но сама по себе переменная окружения PAGER осталась неизменной в сессии bash.

Итоги и ссылки

Итоги

Ну вот самое время поздравить вас с завершением 3-ей части руководства. Вы уже должны знать как находить информацию в системе и интернет документации, а так же иметь хорошее представление о модели прав доступа в Linux, управлении учетными записями пользователей и окружением.

Ссылки

Не забудьте посмотреть ресурсы c Linux документацией, использованные в этом руководстве, в особенности Linux Documentation Project, где сможете найти различные гайды, FAQ, а так же бесценные страницы мана. Не забудьте также о Linux Weekly News.

The Linux System Administrators guide является хорошим дополнением к этому руководству. Также вы можете найти в интернете весьма полезную статью Эрика Рэймонда "Unix and Internet Fundamentals HOWTO".

  • Bash by example, Part 1: Fundamental programming in the Bourne-again shell (перевод планируется)
  • Bash by example, Part 2: More bash programming fundamentals (перевод планируется)
  • Bash by example, Part 3: Exploring the ebuild system. (перевод планируется)

Для знакомства с редактором Emacs, смотрите руководство «the developerWorks», "Living in Emacs".

Продолжение следует.

Об авторах

Daniel Robbins

Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Читайте также: