Какие bash rc-файлы запускаются в неинтерактивных оболочках / оболочках без регистрации?

839
vol7ron

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

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

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

Надежда

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

  • вызывается независимо от режима взаимодействия / входа, поэтому глобальные переменные среды оболочки могут быть установлены в одном месте
  • выполняет больше как csh / tcsh
3
Некоторые процессы создают свои собственные среды, такие как `cron` и` sudo`. fd0 6 лет назад 0
И я не знаю, ограничено ли это Ubuntu, но Ubuntu имеет общесистемные настройки переменных среды: https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables, в которой упоминается `sudo`. Например, я ожидал бы, что для `cron` уже установлено` $ USER`, но вместо этого он устанавливает `$ LOGNAME` - я думаю (точно не помню) vol7ron 6 лет назад 0

1 ответ на вопрос

1
KCD

Ответ на ваш конкретный вопрос заключается в том, что часто только /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

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

Похожие вопросы