Источники дополнительных файлов при входе (~/.bash_profile? ~/.bashrc? /etc/profile? /etc/bashrc?)

Вопрос или проблема

У меня настроено несколько специальных псевдонимов и подобных вещей на нескольких серверах (CentOS 7, оболочка bash).

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

Я установил уникальные псевдонимы для каждого сервера в файле ~/.bash_profile, который включает другой файл, распространяемый через Git, с всеми неуникальными переменными окружения. Таким образом, всякий раз, когда я добавляю псевдоним или переменную, которую я хочу, чтобы добавили все серверы, я добавляю их в файл и отправляю через Git.

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

Я пытался включить файл неуникальных из разных мест – используя скрипт из /etc/profile.d/, используя /etc/bashrc, /etc/profile и ~/.bash_rc, что приводит к зацикливанию, которое зависает вход.

Файл bash_profile выглядит примерно так:

# .bash_profile
source "/etc/non_uniques_file"

# Уникально для этого сервера
alias servername=[имя сервера]...

А файл неуникальных выглядит примерно так:

# Получите псевдонимы и функции
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# Переменные среды и программы запуска специфичные для пользователя
PATH=$PATH:$HOME/bin
export PATH
export HISTTIMEFORMAT="%d/%m/%y %T "
export HISTSIZE=2000
export HISTFILESIZE=20000...

Мой вопрос заключается в том, где будет правильное место для включения уникального файла, чтобы он был установлен глобально и при любых обстоятельствах?

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

Спасибо!

Личные vs глобальные

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

Это значит, что они не являются хорошими кандидатами для включения другими пользователями. (т.е. глобальными).

Глобальные

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

Местоположение этих файлов может на самом деле различаться в различных дистрибутивах. Места вроде /etc/default и аналогичных – хорошее начало для поиска.

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

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

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

Я думаю, что есть два варианта:

  1. Не включать ничего и просто поместить два файла, которые вы хотите запустить, в /etc/profile.d. Я бы назвал их что-то вроде appname_global_vars и appname_node_vars

  2. Поместите их в любое другое место, кроме /etc/profile.d, которое доступно для чтения (У вас уже есть /home/bin, так почему бы не туда?)

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

Вам повезло – я сегодня отвечал на другой вопрос по стартовому файлу оболочки и создал https://www.talisman.org/~erlkonig/writings/on-unix/bash-startup-advice/

Из этого и учитывая, что мы находимся на разных Linux:

  • ~/.bash_profile читается только входными оболочками
  • /etc/profile читается только входными оболочками
  • /etc/profile.d/* читается только /etc/profile
  • /etc/bashrc вообще не читается, если только не косвенно другим файлом, возможно, /etc/bash.bashrc с CentOS или местными модификациями
  • ~/.bash_rc не читается и нарушает нормы имен файлов с точкой

Таким образом, проблемы, вероятно, возникают из-за не входных оболочек, то есть:

  • подоболочек (сокращение для “интерактивной не входной оболочки”)
  • неинтерактивных оболочек

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

Для поддиректории читаются только эти:

  • /etc/bash.bashrc
  • ~/.bashrc

А ваш пост фактически не упоминает их, кроме как в качестве чего-то, на что ссылается файл неуникальных. ~/.bash_profile действительно должен читать ~/.bashrc после завершения всей другой настройки.

Итак, я предполагаю, что эти [достаточно необычные] уникальные должны быть прочитаны либо из:

  • /etc/profile.d/<что-то>.sh если это переменные окружения
    • так как этот псевдоним servername вероятно, должен быть
    • и $HOSTNAME, возможно, уже это имеет
  • /etc/bash.bashrc.d/<что-то>.sh
    • который по умолчанию не существует
    • и вам нужно будет расширить bash.bashrc, чтобы прочитать их
    • и заставлять bash.bashrc делать что-то – это немного противоречит нормальной практике, потому что это влияет на время старта всех интерактивных подшеллов (и некоторые входные оболочки пользователей, если они включают ~/.bashrc, что они должны)
    • так что будьте очень осторожны в том, что вы добавляете

Другие мысли

  • Псевдонимы – это ужасное наследие от C Shell с одним неясным использованием, цепочкой псевдонимов, о которой почти никто даже не знает (вы действительно добавляли пробел в конец значения вашего псевдонима?). Если вы не используете эту причуду, используйте функции вместо этого.
  • Ищите другие подходы, чем даже функции, когда это возможно. Если это статические данные, вы можете использовать некоторые пространственные переменные окружения, но не если их будет много (существует жесткое ограничение около 2 МБ, раньше это было несколько КБ)
  • Вам следует рассмотреть использование инструментов командной строки с парой ключей, если их будет много
  • Функции должны быть чем-то, что пользователи могут выбирать, например, вы можете иметь множество функций, связанных с какой-то темой, а затем оставить их не определенными, кроме одной функции, которая на самом деле вызывает их определение (и возможно перезаписывает себя). В противном случае вы заполняете списки функций пользователей ненужным образом и замедляете все их вызовы оболочки одновременно
  • Эта специальная функция может принимать аргументы для того, какие дополнительные данные, функции и т. д. добавить в контекст вызывающего пользователя

Ответ или решение

Исходные дополнительные файлы при входе в систему: Профилирование bash в CentOS 7

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

1. Основные файлы конфигурации Bash и их назначение

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

  • /etc/profile: Этот файл выполняется при входе в систему для всех пользователей, работающих с интерактивной оболочкой (login shell). Он является глобальным и может содержать общие настройки для всех пользователей.

  • /etc/bashrc (или bash.bashrc): Этот файл выполняется для интерактивных небудущий оболочек. Он также может включать в себя общие настройки, но они применяются к текущему пользователю и его сессии.

  • ~/.bash_profile: Этот файл специфичен для пользователя и выполняется при входе в систему (login). Обычно здесь настраиваются пользовательские переменные окружения и вызываются другие конфигурационные файлы, такие как ~/.bashrc.

  • ~/.bashrc: Этот файл выполняется для интерактивных оболочек, не являющихся входными (non-login shells). Это идеальное место для настройки алиасов и функций, которые должны быть доступны в различных сессиях.

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

2. Где правильно размещать уникальные настройки?

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

  • Переместите ваши уникальные алиасы в /etc/profile.d/ как отдельный файл. Например, создайте файл 00-server-unique-variables.sh, где вы можете добавить ваши уникальные алиасы и переменные окружения. Это позволяет загружать их автоматически для всех пользователей и избежать проблем с дублированием.
# Пример файла /etc/profile.d/00-server-unique-variables.sh
alias servername='имя_сервера'
  • Убедитесь, что вы экспортируете все переменные окружения, которые должны быть общими. Это обеспечит их доступность во всех сеансах:
# Пример добавления переменной
export UNIQUE_VAR='значение'

3. Почему настройки могут не применяться в некоторых случаях?

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

  • Тип запуска оболочки: Если вы используете небудущий шелл (non-login shell), он не считывает ~/.bash_profile. Поэтому, если настройки в ~/.bash_profile должны работать и в интерактивных оболочках, убедитесь, что они включают ссылку на ~/.bashrc.

  • Файлы не считываются повторно: Если вы обновляете файл конфигурации, который считается загруженным, Bash не будет считывать его снова, пока не запустите новую сессию оболочки. Использование команд source для ручного перезагрузки требует дополнительных действий от пользователя.

4. Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...