Библиотека сайта rus-linux.net
Файлы профилей и RC-файлы
Оригинал: Profiles and RC Files
Автор: Shawn Powers
Дата публикации: 22 июня 2016 г.
Перевод: А.Панин
Дата перевода: 27 июня 2016 г.
Файлы профилей и RC-файлы
Мне нравится Linux и, если вы читаете эти строки, велика вероятность того, что наши вкусы совпадают. Но, откровенно говоря, некоторые аспекты рабочего окружения Linux являются не самыми очевидными. В верхней части моего списка таких аспектов, несомненно, располагается система профилей. С концептуальной точки зрения она является достаточно простой. Существуют системные настройки, которые используются всеми пользователями, а также индивидуальные настройки, которые пользователи могут изменять в соответствии со своими потребностями. Проблема заключается в том, что в различных дистрибутивах обработка файлов профилей осуществляется по-разному, при этом невозможно игнорировать значительные различия между командными оболочками, использующимися для входа в систему, и интерактивными командными оболочками. Обычно эти вопросы не очень заботят пользователей систем на основе ядра Linux. Но при необходимости внесения изменений в один из файлов профиля приходится выполнять крайне надоедливые исследования с целью определения порядка загрузки файлов профиля, а также выявления файлов, которые загружаются лишь командными оболочками, использующимися для входа в систему, и так далее…
Командные оболочки, использующиеся для входа в систему
Во-первых, позвольте дать небольшие пояснения относительно того, какие командные оболочки я имею в виду при разговоре о командных оболочках, использующихся для входа в систему. Вы наверняка обратили внимание на то, что в некоторых случаях при открытии командной оболочки вам предлагается ввести имя пользователя и пароль. В других случаях после нажатия на иконку эмулятора терминала вы сразу же можете работать с командной оболочкой от лица текущего пользователя. Это чаще всего происходит при работе с графическим окружением рабочего стола. По сути, если вы уже вошли в Linux-систему, установленную на вашем настольном компьютере, при открытии окна эмулятора терминала вам предоставляется интерактивная командная оболочка.
Однако, наличие графического окружения рабочего стола совсем не обязательно. Если вы воспользуетесь клиентом ssh
для открытия командной оболочки на удаленном сервере, вам будет предложено ввести имя пользователя и пароль (следовательно, в этом случае вы будете иметь дело с командной оболочкой, использующейся для входа в систему). Если после этого в рамках сессии SSH ввести команду bash
, откроется совершенно новый терминал, причем в этом случае вы будете иметь дело уже с интерактивной командной оболочкой (обратите внимание на то, что вам не нужно будет вводить пароль). Я расскажу о важности этого различия чуть позже, но, в любом случае, просто помните о том, что при запросе имени пользователя и пароля вы наверняка имеете дело с командной оболочкой, использующейся для входа в систему. Если же вы сразу видите приветствие командной оболочки bash, вы наверняка имеете дело с интерактивной командной оболочкой. Единственным довольно часто встречающимся исключением из данного правила является командная оболочка с ключами SSH, которые позволяют осуществлять автоматический вход в систему без ввода пароля. В этом случае, несмотря на отсутствие запроса имени пользователя и пароля, вы имеете дело с командной оболочкой, использующейся для входа в систему. Вообще, вы с большой вероятностью будете правы, если будете считать, что при доступе к удаленной системе по протоколу SSH всегда используется командная оболочка для входа в систему.
Принцип работы командной оболочки, использующейся для входа в систему
Принцип работы командной оболочки, использующейся для входа в систему, является гораздо боле запутанным, чем принцип работы интерактивной командной оболочки, поэтому я предлагаю рассмотреть его в первую очередь. Будем считать, что на уровне учетных записей пользователей вашей системы в файле конфигурации /etc/passwd в качестве командной оболочки установлена командная оболочка bash. Это наиболее популярная командная оболочка, поэтому есть смысл разобраться с нюансами ее работы.
Шаг 1: после аутентификации с помощью командной оболочки, использующейся для входа в систему, осуществляется поиск файла с именем /etc/profile. Это файл сценария командной оболочки, с помощью которого осуществляется установка значений нескольких переменных окружения для всех пользователей системы.
Шаг 2: сценарий /etc/profile перед завершением своей работы обычно осуществляет подключение всех сценариев из директории /etc/profile.d и их исполнение. В большинстве случаев исполняются лишь сценарии с расширением .sh из директории /etc/profile.d, но, в любом случае, следует заглянуть в код сценария /etc/profile для того, чтобы выяснить особенности форматирования дополнительных сценариев для их успешного исполнения. Использование директории для дополнительных сценариев является важным аспектом рассматриваемого механизма, так как она позволяет модифицировать рабочее окружение каждого из пользователей в масштабах всей системы на уровне командной оболочки, использующейся для входа в систему, без опасной модификации сценария /etc/profile. Кроме того, при ее отсутствии любые обновления системы, затрагивающие файл сценария /etc/profile, могли бы уничтожать внесенные вами изменения. В случае же простого добавления файла сценария в директорию /etc/profile.d, он будет подключен сценарием /etc/profile даже после обновления последнего.
Шаг 3: впоследствии сценарий /etc/profile исполняет сценарии пользовательского профиля. Эта часть является немного неоднозначной, так как могут исполняться различные сценарии из состава пользовательского профиля в зависимости от используемого дистрибутива и/или пользовательских настроек. В общем случае будет предпринята попытка подключения сценариев со перечисленными ниже именами из состава пользовательского профиля в следующей последовательности:
- .bash_profile
- .bash_login
- .profile
По сути, на данном этапе осуществляется поиск файла сценария с именем из приведенного выше списка в домашней директории пользователя, его исполнение и завершение работы основного сценария. В данном случае при наличии файлов сценариев с именами .bash_profile и .profile в домашней директории будет исполнен лишь один из них, а именно, .bash_profile. Это обстоятельство необходимо учитывать в том случае, если вы желаете изменить ваш профиль рабочего окружения, но не горите желанием редактировать его оригинальные файлы. По умолчанию в дистрибутиве Ubuntu в домашнюю директорию каждого пользователя копируется файл .profile, но при этом в ней отсутствуют файлы .bash_profile и .bash_login. Таким образом, если вы хотите изменить профиль своего рабочего окружения, вы можете просто создать в своей домашней директории копию сценария .profile с именем .bash_profile и внести в нее все необходимые коррективы. В этом случае в вашей директории останется оригинальный файл .profile в своем первозданном виде, при этом все необходимые вам команды будут корректно исполняться. Просто помните о том, что при создании пустого файла с именем .bash_profile система будет считать его сценарием конфигурации вашего рабочего окружения и полностью игнорировать файл сценария с именем .profile!
Шаг 4: наконец, последним файлом, исполняемым силами командной оболочки, использующейся для входа в систему, является файл .bashrc из домашней директории пользователя. Это еще один файл сценария — и на этот раз он вызывается из сценария .profile, исполняющегося на шаге 3. Обратите внимание на то, что при изменении профиля пользователя при любых обстоятельствах необходимо проверять наличие в используемом сценарии команды для вызова сценария .bashrc. В рамках сценария .bashrc осуществляется применение персональных параметров конфигурации, таких, как нестандартное приветствие или цвет текста командной оболочки, а также активация псевдонимов для команд (подробнее о них будет сказано позднее).
Шаг 5: данный шаг на самом деле не выполняется после шага 4; наоборот, он может выполняться после шага 1. Сценарий /etc/profile сразу же после начала загрузки сценариев пользовательских профилей начинает исполнение системного файла сценарий bashrc. Опять же, в различных дистрибутивах этот файл носит разные имена, но чаще всего встречается либо /etc/bashrc, либо /etc/bash.bashrc. В случае дистрибутива Ubuntu это файл /etc/bash.bashrc, но исторически он всегда носил имя /etc/bashrc. Учтите, что в отличие от пользовательского файла .bashrc, имя системного файла bashrc не начинается с символа точки.
Для достижения еще большего разнообразия некоторые системы не исполняют системный файл bashrc при начале работы с командными оболочками, используемыми для входа в систему, поэтому в том случае, если вы не обнаружите вызов этого файла сценария в коде из файла сценария /etc/profile, он гарантированно не будет исполнен при начале работы с командной оболочкой, используемой при входе в систему. Однако, в большинстве дистрибутивов файл сценария /etc/profile все-таки содержит вызов системного файла сценария bashrc. А так как вам теперь известен порядок загрузки файлов сценариев профиля, вы можете исследовать свою систему и определиться с тем, какие файлы сценариев задействуются при начале работы с командной оболочкой, используемой для входа в систему.
Интерактивные командные оболочки
При начале работы с интерактивной командной оболочкой выполняется гораздо более простая последовательность операций. Процесс подготовки рабочего окружения, выполняющийся при открытии пользователем интерактивной командной оболочки (то есть, командной оболочки, которая не предлагает пройти аутентификацию с использованием имени пользователя и пароля), может быть разделен на отдельные шаги следующим образом:
Шаг 1: исполняется файл сценария /etc/bashrc или /etc/bash.bashrc. Исполнение этого файла сценария никоим образом не зависит от наличия соответствующей ссылки в файле сценария /etc/profile. В то время, как командная оболочка, используемая для входа в систему, автоматически исполняет файл сценария /etc/profile, интерактивная командная оболочка автоматически исполняет файл сценария /etc/bashrc (или /etc/bash.bashrc).
Шаг 2: исполняется файл .bashrc из домашней директории пользователя. И снова, как и в случае с системным файлом сценария bashrc, данный файл вызывается не из файла сценария пользовательского профиля; напротив, он исполняется непосредственно интерактивной командной оболочкой. Таким образом, если вы удалите ссылку на файл сценария .bashrc из файла сценария .profile, интерактивная командная оболочка все так же будет исполнять его.
И на этом процесс подготовки рабочего окружения заканчивается! Интерактивная командная оболочка не обрабатывает какую-либо информацию, касающуюся профиля пользователя из системной или пользовательской директорий. Однако, ввиду того, что интерактивная командная оболочка является «дочерним» процессом командной оболочки, используемой для входа в систему (посредством эмулятора терминала с графическим интерфейсом или клиента SSH), она наследует всю информацию, относящуюся к профилю пользователя, которая была получена родительской командной оболочкой. Таким образом, несмотря на то, что как командная оболочка, используемая для входа в систему, так и «дочерняя» интерактивная командная оболочка имеют доступ к одинаковой информации, относящейся к профилю пользователя, интерактивная командная оболочка не осуществляет повторную загрузку этой информации, что очень важно понимать. Эта командная оболочка никогда не использует сценарии, относящиеся к профилям пользователей, поэтому любая информация, которая была загружена при входе в систему средствами соответствующих сценариев, является единственной доступной ей информацией. (Данное разделение будет еще более важным при детальном рассмотрении функций описанных сценариев.)
Для чего предназначены файлы профилей?
Во-первых, я хотел бы предупредить вас о следующем: я могу говорить лишь о тех операциях, которые выполняются с помощью файлов профилей и rc-файлов, поставляемых в составе системы по умолчанию. Конечно же, любой человек имеет возможность изменить набор этих операций, просто отредактировав соответствующие файлы профилей или rc-файлы. Но все же, при любых обстоятельствах рекомендуется придерживаться стандартов.
Файлы профилей используются главным образом для загрузки значений переменных окружения. Так как файлы профилей загружаются командными оболочками, используемыми для входа в систему, а эти оболочки, в свою очередь, являются начальной точкой входа пользователей в систему, в установке значений переменных окружения на этом этапе имеется смысл. Одной из самых важных переменных окружения является переменная PATH. Установка значения переменной окружения PATH осуществляется в момент инициирования создания командной оболочки для входа в систему. Значения других переменных окружения также могут устанавливаться как системном файле профиля, так и в файлах профилей отдельных пользователей, но на данный момент вам следует усвоить, что система профилей является системой, осуществляющей установку значений большинства переменных окружения.
Порядок загрузки информации профиля является очень важным, так как при возникновении необходимости в изменении информации из стандартного системного профиля вы должны иметь возможность установки значений соответствующих переменных окружения на уровне файла сценария вашего пользовательского профиля. Например, значение переменной PATH обычно модифицируется силами файла сценария профиля пользователя в момент входа последнего в систему. Обычно с помощью файла с именем .profile (или же файла с именем .bash_profile или другими именами, упомянутыми выше) осуществляется добавление подстроки ~/bin к значению переменной окружения PATH в том случае, если пользователи имеют директории для хранения бинарных файлов bin в рамках своих домашних директорий. Ввиду того, что пользовательские файлы профилей загружаются после системного файла профиля, пользовательские настройки имеют приоритет перед системными.
Для чего предназначены RC-файлы?
И снова, если говорить обобщенно, системный файл сценария bashrc и после него отдельные пользовательские файлы сценариев .bashrc обычно используются для установки параметров интерфейса командной строки системы. Если вы хотите использовать собственное приветствие или определенную цветовую схему командной оболочки, вы можете прибегнуть к редактированию одного из файлов bashrc. Практически так же, как и в случае с системой профилей, настройки из пользовательских файлов .bashrc имеют приоритет перед настройками из системного файла bashrc (или файла bash.bashrc, о котором также говорилось выше). Это означает, что вы можете изменить поведение интерфейса командной строки системы в соответствии со своими предпочтениями, не затрагивая других пользователей системы.
Одна из наиболее частых модификаций файла .bashrc связана с добавлением псевдонимов команд. Псевдоним команды является своего рода текстовым сокращением, вместо которого подставляется указанная вами произвольная команда. Например, ниже приведен фрагмент файла .bashrc из домашней директории пользователя:
alias ll='ls -alF' alias la='ls -A' alias l='ls -CF'
Благодаря объявлению соответствующего псевдонима команды, после ввода пользователем команды ll
система будет исполнять команду ls -alF
вместо нее. Это отличный механизм, позволяющий создавать сокращения для команд с множеством плохо запоминающихся параметров или команд, которые чаще всего используются.
Хотя я и не рекомендую заниматься дурачеством, механизм псевдонимов команд .bashrc также может являться почвой для различных шуток над теми из ваших бедных пользователей, которые не заботятся о выходе из системы. Представьте, что вы создали аналогичный псевдоним команды:
alias ls='echo "Удаление всех файлов…"'
В результате каждый раз при выполнении команды ls
они будут видеть шуточное (безвредное) сообщение! Да, с помощью механизма псевдонимов команд несложно организовать и более гнусные шутки, но так как все мы не забываем выйти из системы, когда отлучаемся от наших рабочих станций, нам не стоит беспокоиться об этом, верно?!
Некоторые ловушки
Понимание принципа работы командных оболочек значительно облегчает отладку системы. Вы наверняка уже поняли описанные аспекты их функционирования, но все же стоит дополнительно остановиться на некоторых важных моментах. При внесении изменений в любые из файлов сценариев профилей эти изменения не будут применены до момента запуска новой командной оболочки для входа в систему. Это же утверждение справедливо и в случае модификации файлов .bashrc, но ввиду простоты перезапуска интерактивной командной оболочки их гораздо проще активировать.
Одна из основных проблем, связанная с загрузкой файлов профилей, заключается в необходимости выхода из системы и повторного входа в нее для тестирования корректности изменения значений переменных окружения, таких, как PATH. Разумеется, вы можете установить значение переменной окружения и с помощью интерактивной командной оболочки, но при этом стоит помнить о том, что любая новая интерактивная командная оболочка будет наследовать параметры профиля оболочки, использованной для входа в систему, поэтому повторный вход в систему на самом деле является единственным способом для применения изменений на постоянной основе.
Кроме того, хотя я уже говорил об этом, я хотел бы повторить, что хотя сценарии системного (/etc/profile) и пользовательского профилей в большинстве случаев вызывают сценарии bashrc, они не обязаны это делать. Поэтому если вы внесете изменения в ваш файл профиля, с высокой вероятностью командные оболочки, используемые для входа в систему, будут вести себя не так, как интерактивные командные оболочки. Если это соответствует вашим целям, то отлично, но чаще всего вам придется добиваться исполнения сценариев bashrc командными оболочками, используемыми для входа в систему, так как это позволит повысить пользовательские качества интерфейса командной строки вашей системы.
Наконец, я хотел бы добавить, что лучшей методикой изучения принципа работы файлов профилей и rc-файлов являются эксперименты с вашей системой. Исследование способов манипуляций с настройками профилей полезно не только в ознакомительных целях, но и для значительного улучшения пользовательских качеств интерфейса командной строки вашей системы.