Недавно я столкнулся со следующей проблемой: приложение не сохраняло настройку umask
, заданную в профиле root-пользователя, или в файле /etc/profile
. Немного разобравшись в вопросе, я понял, что приложение использует только ту настройку umask
, которая задана в /etc/bashrc
, не принимая даже те значения, которые являются его же собственными сценариями запуска.
Немного изучив вопрос, я понял, какую функцию выполняют эти файлы, чем они различаются и как они выполняются. Такой вопрос поднимается не часто, поэтому я подумал, что будет полезно рассказать о нем вам.
Для чего нужен файл /etc/profile?
Если вы используете Linux, то вам наверняка знакомы файлы .profile
или .bash_profile
, размещенные в вашем домашнем каталоге. Эти файлы используются для задания элементов окружения для оболочки пользователя. Таких элементов, как, например, umask
, и таких переменных, как PS1
или PATH
.
Файл /etc/profile
не очень-то отличается от этих файлов. Он используется для задания общесистемных переменных окружения в оболочках пользователя. Иногда это те же переменные, что и в .bash_profile
, но этот файл используется для задания первоначальных PATH
или PS1
для всех пользователей оболочек системы.
/etc/profile.d
Помимо задания элементов окружения, файл /etc/profile
выполняет сценарии внутри /etc/profile.d/*.sh
. Если вы хотите задать свои собственные переменные окружения для всей системы, вам следует поместить свою конфигурацию в сценарий оболочки в /etc/profile.d
.
Для чего нужен файл /etc/bashrc?
Помимо .bash_profile
, в своем домашнем каталоге вы также часто будете встречать файл .bashrc
. Этот файл предназначен для задания псевдонимов команд и функций, используемых пользователями оболочки bash.
Аналогично тому, как /etc/profile
является общесистемной версией .bash_profile
, файл /etc/bashrc
в Red Hat и файл /etc/bash.bashrc
в Ubuntu являются общесистемной версией .bashrc
.
Стоит отметить, что в Red Hat реализация /etc/bashrc
также выполняет сценариий оболочки в /etc/profile.d
, но только если пользовательская оболочка является Интерактивной оболочкой (т.е. Login Shell (стартовой оболочкой))
Когда используются эти файлы?
То, когда выполняется каждый из этих файлов, зависит от типа выполняемого логина. В Linux имеется два типа стартовых оболочек (login shells) — Интерактивные оболочки и Неинтерактивные оболочки. Интерактивная оболочка используется, когда пользователь может взаимодействовать с оболочкой, т.е., например, типичное приглашение командной строки bash. Неинтерактивная оболочка используется, когда пользователь не может взаимодействовать с оболочкой, т.е. выполнение bash-сценариев.
Разница проста: файл /etc/profile
выполняется только для интерактивных оболочек, а файл /etc/bashrc
– как для интерактивных, так и для неинтерактивных. Вообще-то, в Ubuntu файл /etc/profile
вызывает файл /etc/bashrc
напрямую.
Интерактивная оболочка и неинтерактивная оболочка: Сравнение
Чтобы на примере сравнить интерактивную и неинтерактивную оболочки, я добавлю переменную в оба файла /etc/profile
и /etc/bash.bashrc
в своей Ubuntu.
/etc/profile
grep TEST /etc/profile
export TESTPROFILE=1
/etc/bash.bashrc
grep TEST /etc/bash.bashrc
export TESTBASHRC=1
Интерактивная оболочка
Ниже приведен пример интерактивной оболочки. В этом случае были выполнены оба файла /etc/profile
и /etc/bash.bashrc
.
su -
env | grep TEST
TESTBASHRC=1
TESTPROFILE=1
Неинтерактивная оболочка
В этом примере мы выполняем команду через оболочку SSH, которая является неинтерактивной; поскольку это неинтерактивная оболочка, выполняется только файл /etc/bash.bashrc
.
# ssh localhost "env | grep TEST"
root@localhost's password:
TESTBASHRC=1
Заключение
В моем случае приложение не признает значение umask
, заданное в файле /etc/profile
, но признает значение в файле /etc/bashrc
. Это говорит о том, что подпроцесс начинается как неинтерактивная оболочка. Поскольку предлагаемый способ изменения переменных окружения заключается в добавлении сценария оболочки в /etc/profile.d
, в моем случае лучше задать значение umask
в файле /etc/bashrc
.