Почему /etc/profile не вызывается для не входящих в систему оболочек?
Оболочка для входа и не входа в систему определяется как:
su - $USER # will give you a login shell
bash # will give you a non-login shell
/ etc / profile не вызывается для оболочек без входа в систему, например, когда вы запускаете konsole (kde). /etc/profile вызывается только для оболочек входа в систему.
Это почему? Пожалуйста, объясните, потому что мне нравится понимать обоснование этого.
1 ответ
/etc/profile
вызывается только для оболочек входа в систему, потому что это его конкретное назначение.
Если вы хотите, чтобы команда выполнялась для интерактивных оболочек, которые не являются оболочками входа в систему, и вы используете bash
положить в ~/.bashrc
или же /etc/bash.bashrc
,
Назначение файлов профиля состоит в том, чтобы содержать команды, которые должны выполняться только для оболочек входа в систему. Эти файлы:
/etc/profile
управляется всеми Bourne-совместимыми оболочками (включаяbash
а такжеdash
) при запуске в качестве оболочки для входа.Скрипты в
/etc/profile.d
,Это для оболочек в стиле Борна, но оно не закодировано в самом исполняемом файле оболочки. Скорее, команды в
/etc/profile
называет их. Например, в моей системе Ubuntu 12.04,/etc/profile
включает в себя эти строки:if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done unset i fi
.profile
в домашнем каталоге пользователя, запускается совместимыми с Bourne оболочками при запуске в качестве оболочки входа в систему (если не переопределена, см. ниже)..bash_profile
или же.bash_login
в домашнем каталоге пользователя. Они игнорируются другими оболочками, кромеbash
, Но если.bash_profile
существует,bash
запускает его вместо.profile
, Если.bash_profile
не существует, но.bash_login
существует, то есть запускается вместо.profile
,(Но это характерно для
.bash_profile
или же.bash_login
, когда он существует, должен быть написан так, чтобы * явно вызывать.profile
.)Преимущество специфичных для оболочки файлов профиля состоит в том, что они могут содержать команды или синтаксис, которые действительны только для этой оболочки. Например, я могу использовать
[[
оператор оценки в.bash_profile
/.bash_login
но если я использую это в.profile
а затем войдите сdash
как моя оболочка, это не удастся.
Что должно идти в "профильных" файлах
"профильные" файлы должны содержать команды, которые должны запускаться только один раз, в начале входа в систему. (Это включает в себя графические входы в систему, так как они также начинаются с оболочки входа в систему.) Если оболочка является интерактивной, пользователь, запустивший ее, вероятно, вошел в систему, и поэтому у него, вероятно, есть предок (который запустил или запустил то, что запустил ее, или начал это и т. д.) это была оболочка входа в систему.
Возможно, вы захотите выполнить команду только один раз, потому что:
- нет причин запускать его более одного раза за один вход в систему, это будет неэффективно или
- это приведет к нежелательному результату - запускать его несколько раз за вход в систему.
В качестве примера второй ситуации, когда может возникнуть нежелательный результат, рассмотрим эти строки, которые по умолчанию появляются у каждого пользователя. ~/.profile
:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Предположим, вы в SSH запустили другую оболочку (скажем, zsh
), в какой-то момент обнаружил, что вы хотели временно вернуться к bash
но держи свое окружение (так побежал bash
снова в то время как в zsh
), а затем запустил программу, как mc
который запускает оболочку как часть своего интерфейса. Если bin
существует в вашей домашней папке и ваше имя пользователя james
, ваш PATH
во внутренней оболочке это что-то вроде:
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Это неэффективно и (что гораздо важнее) затрудняет понимание содержания PATH
,
Это ни в коем случае не катастрофа. Насколько я могу судить, если бы каждая интерактивная оболочка создавала "профильные" файлы, ничего страшного не произошло бы в конфигурации по умолчанию. Однако, поскольку цель файлов "профиля" состоит в том, чтобы содержать команды для однократного запуска при каждом входе в систему, пользователь или администратор может добавлять команды в профиль, которые должны выполняться только при запуске оболочки входа в систему.
Где разместить команды для запуска каждой интерактивной оболочки
Если вы используете bash
Есть файлы для команд, которые должны выполняться в каждой интерактивной оболочке:
/etc/bash.bashrc
.bashrc
в домашнем каталоге пользователя.
Это чаще всего используется для команд, которые
- влияют только на среду оболочки, в которой они работают, - даже на дочерние оболочки, или
- должен работать, даже если это не оболочка входа в систему.
Например, завершение табуляции в командной строке обычно должно быть включено независимо от того, bash
была оболочка входа Так что это появляется в ~/.bashrc
:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
Там применяются 1 и 2: это не переносится на другие оболочки, запущенные внутри этой, и завершение табуляции должно работать в bash
даже если я вошел в систему с другой оболочкой.
Куда помещать команды для оболочек входа и интерактивных оболочек без входа в систему
Если вы используете bash
и чтобы команда запускалась в оболочках входа в систему и интерактивных оболочках, а они не являются оболочками входа в систему, обычно достаточно поместить ее в /etc/bash.bashrc
или же ~/.bashrc
, Это потому, что по умолчанию /etc/profile
а также ~/.profile
запустите их явно. Например, ~/.profile
имеет:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(Так же, /etc/profile
источники /etc/bash.bashrc
за bash
.)
Таким образом, файлы "profile" и "rc" запускаются при запуске интерактивного bash
оболочка (независимо от того, является ли она оболочкой входа в систему).
Где разместить команды для запуска в неинтерактивных оболочках
Вы, вероятно, не хотите указывать какие-либо команды для запуска всех неинтерактивных оболочек; они будут запускаться при каждом запуске сценария (при условии, что сценарий запускается оболочкой, настроенной для их запуска).
Это может вызвать существенную поломку. Если вы собираетесь это сделать, и в системе нет учетной записи администратора, кроме той, которую вы используете, вы можете создать ее; это может облегчить исправление ошибок.
В bash
файлы "rc" фактически запускаются независимо от того, является ли оболочка интерактивной или нет. Однако наверху они говорят:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Таким образом, если вам нужны команды для автоматического запуска даже в неинтерактивных оболочках, подобных тем, которые запускаются для выполнения сценариев, вы можете добавить свои команды перед этими строками.
Запуск Оболочки входа
Вход в систему запускает оболочку входа. Если вы хотите, чтобы оболочка, запущенная после этого, действовала как оболочка входа в систему, запустите ее с -l
флаг (расшифровывается как l ogin). Например:
Это лучший способ запустить оболочку входа в систему (без входа в систему), если вы не хотите запускать ее как другого пользователя. Затем используйте:
sudo -i
заroot
(использованиеsudo -s
для не авторизованной, интерактивной корневой оболочки)sudo -u username -i
для любого пользователяsu - username
для неroot
пользователи (использоватьsu username
для не авторизованной, интерактивной корневой оболочки)
Что такое начальная оболочка для входа?
Начальная оболочка входа в систему аналогична оболочке входа в систему. Везде, где этот ответ говорит "оболочка входа в систему", он мог бы сказать "начальная оболочка входа в систему" (кроме этого раздела, который уже перестал бы иметь смысл).
Одной из причин термина " начальная оболочка входа в систему" является то, что оболочка входа также используется в другом смысле - для определения того, какая программа используется в качестве оболочки, которая выполняется при входе в систему. В этом и заключается смысл входа в систему:
- "Оболочка для входа в OpenBSD по умолчанию
ksh
; в Ubuntu этоbash
". - "Вы можете изменить свой логин с
chsh
".
Дальнейшее чтение
- "Конфигурационные файлы для оболочек" в "Unix shell" (Википедия)
bash
страница руководства- Полное руководство по bash (GNU)