3

Мое понимание

  • нет никаких rc-файлов, вызываемых для неинтерактивных / не входящих в систему оболочек; например, те, которыми управляет cron
    (Я не знаю этого наверняка и опираюсь на опыт сообщества)

  • для неинтерактивных оболочек требуется установить переменную среды BASH_ENV , что позволяет установить ее для определенного файла rc (например, BASH_ENV=$HOME/.bash_profile)

Надежда

Я не уверен в большом количестве доступных файлов rc, поэтому мне любопытно, есть ли такие, с которыми я не знаком. Надеемся найти файл rc, который удовлетворяет следующим условиям:

  • вызывается независимо от режима взаимодействия / входа, поэтому глобальные переменные среды оболочки могут быть установлены в одном месте
  • выполняет больше как csh / tcsh

1 ответ1

1

Ответ на ваш конкретный вопрос заключается в том, что часто загружается только /etc/bash.bashrc (или /etc/bashrc).

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

Поддельный логин

При входе в систему запускается /etc/profile и вы часто можете размещать свои собственные сценарии в /etc/profile.d/*.sh

Оберните это в логин bash

Иногда проще всего запустить логин, т.е.

echo "do whatever $PATH $BASH $PS1 $0"

становится

bash -lc 'echo "do whatever $PATH $BASH $PS1 $0"'

Вручную загрузить профиль

Делайте то, что делают логины, загружайте профиль вручную

source /etc/profile;echo "do whatever $PATH $BASH $PS1 $0"

Изменить глобальные переменные среды

Для простых переменных, которые вы можете добавить в /etc/environment смотрите Ubuntu System-wide_environment_variables, но расширение переменных не работает

THING_HOME="/opt/thing"
PATH="$PATH:/opt/thing" # this will NOT work

Для PATH вы можете добавить к нему, например, sudo sed -i 's#PATH=\"[^\"]*#&:/opt/thing#' /etc/environment

Редактировать все оболочки Bash

Вы можете добавить в /etc/bash.bashrc (или /etc/bashrc), однако обычно это происходит рано, если не интерактивен, так что вам нужно взломать ваши дополнения до:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Не делай ничего из этого

  • Рассмотрим символические ссылки, если вы пытаетесь что-то добавить в PATH
  • Подумайте о том, чтобы заставить ваши программы / скрипты изменять свою среду
  • В Systemd есть EnvironmentFile и Environment например, systemctl edit --full cron.service

Мне интересно услышать, есть ли у кого-то еще лучшие обходные пути!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .