Почему / etc / profile не вызывается для не входящих в систему оболочек?

Оболочка для входа и не входа в систему определяется как:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile не вызывается для оболочек без входа в систему, например, при запуске konsole (kde). / etc / profile вызывается только для оболочек входа в систему.

Почему это? Пожалуйста, объясните, потому что мне нравится понимать обоснование этого.

51
задан 26 January 2013 в 08:06

1 ответ

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

Если вы хотите, чтобы команда выполнялась для интерактивных оболочек, которые не являются оболочками входа в систему, и вы используете bash, поместите ее в ~/.bashrc или /etc/bash.bashrc.

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

  • /etc/profile, управляемые всеми Борн-совместимыми оболочками (включая 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 в качестве моей оболочки, он потерпит неудачу.

Что должно идти в файлах «профиля»

Файлы «профиля» должны содержать команды, которые должны выполняться только один раз, в начале входа в систему. (Это включает в себя графические входы в систему, так как они также начинаются с оболочки входа в систему.) Если оболочка является интерактивной, пользователь, запустивший ее, вероятно, вошел в систему, и поэтому у него, вероятно, есть предок (который запустил или запустил то, что запустил ее, или начал это и т. д.) это была оболочка для входа.

Возможно, вы захотите выполнить команду только один раз, потому что:

  1. нет причины запускать ее более одного раза за вход, это будет неэффективно, или
  2. это приведет к нежелательному результату - запускать его более одного раза за один вход.

В качестве примера второй ситуации, когда может возникнуть нежелательный результат, рассмотрим эти строки, которые по умолчанию отображаются в каждом пользователе ~/.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.

11158 Однако это ни в коем случае не катастрофа. Насколько я могу судить, если бы каждая интерактивная оболочка создавала файлы «профиля», ничего страшного не произошло бы, в конфигурации по умолчанию . Однако, поскольку цель файлов «профиля» состоит в том, чтобы содержать команды, которые запускаются один раз для каждого входа в систему , пользователь или администратор может добавлять команды в профиль, который должен запускать только при запуске оболочка для входа.

Где разместить команды для каждой интерактивной оболочки для запуска

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

  • /etc/bash.bashrc
  • .bashrc в домашнем каталоге пользователя.

Это чаще всего используется для команд, которые

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

Например, завершение табуляции в командной строке обычно должно быть включено независимо от того, была ли 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 ). Например:

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

  • sudo -i для root (используйте sudo -s для интерактивной корневой оболочки без регистрации)
  • sudo -u username -i для любого пользователя
  • su - username для пользователей, не являющихся root (используйте su username для интерактивной корневой оболочки без регистрации)

Что такое инициал оболочка входа?

Начальная оболочка входа такая же, как и оболочка входа . Везде, где этот ответ говорит «оболочка входа в систему», он мог бы сказать «начальная оболочка входа в систему» ​​(кроме этого раздела, который уже перестал бы иметь смысл).

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

Далее Чтение

0
ответ дан 26 January 2013 в 08:06

Другие вопросы по тегам:

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