Чому / etc / profile не використовується для оболонок без входу?


51

Оболонка для входу та невхід у систему, визначена як:

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

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

Чому так? Поясніть, будь ласка, тому що я люблю розуміти обґрунтування цього.

Відповіді:


100

/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як моя оболонка, він не вдасться.

Що повинно входити у "профільні" файли

Файли "профілю" повинні містити команди, які повинні виконуватись лише один раз на початку входу. (Сюди входять графічні входи, оскільки вони також починаються з оболонки для входу.) Якщо оболонка є інтерактивною, користувач, що працює над нею, ймовірно, увійшов у систему, і тому, ймовірно, має пращура (який запустив його або запустив те, що запустив його, або розпочав це тощо), що був оболонкою для входу.

Ви можете запустити команду лише один раз, оскільки:

  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.

Це аж ніяк не катастрофа. Наскільки я можу сказати, якби кожна інтерактивна оболонка створювала "профільні" файли, у конфігурації за замовчуванням нічого страшного не трапиться . Однак, оскільки мета «профільних» файлів полягає в тому, щоб містити команди для запуску один раз за входом у систему , користувач або адміністратор можуть додавати команди до профілю, який повинен запускатися лише при запуску оболонки входу.

Куди покласти команди для запуску кожної інтерактивної оболонки

Якщо ви використовуєте 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.)

Таким чином, і "профіль", і "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

Що таке початкова оболонка для входу?

Початкові Ввійти оболонки таких же , як оболонка входу . Скрізь у цій відповіді написано "оболонка входу", вона могла б сказати "вхідна оболонка входу" (за винятком цього розділу, який би вже перестав мати сенс).

Однією з причин терміна " inital login shell" є те, що оболонка для входу використовується також в іншому значенні - для визначення того, яка програма використовується як оболонка, яка виконується при вході в систему. Це сенс оболонки для входу, яку говорили:

  • " Оболонка для входу в OpenBSD за замовчуванням ksh; в Ubuntu це bash."
  • "Ви можете змінити оболонку входу за допомогою chsh."

Подальше читання


4
Один з найкращих відповідей на будь-яке питання на будь-якому сайті Stack Exchange.
Марк Е. Хааз

1
> "профільні" файли повинні містити команди, які повинні виконуватись лише один раз на початку входу. (Сюди входять графічні входи, оскільки вони також починаються з оболонки входу.) Ні, ні, ні, ні! Це абсолютно немає! Усі оборотні оболонки читають лише .profile на інтерактивних сесіях оболонки для входу , тобто ті, що розпочалися з опції -i, або ті, що підключені до керуючого терміналу (жоден з них не відповідає дійсності, якщо оболонку запустив диспетчер дисплеїв). Причина цього правда полягає в тому, що ціль цього файлу полягає в налаштуванні терміналу користувача , а не лише їх оточення. Якщо менеджер дисплеїв tr

Еліа, я відтворив решту коментарів Дерека тут, але залишив вищевказаний пень, тому він отримає ваше відповідь на відповідь, хоча він не зможе відповісти на це через вимоги до репутації. Однак я дав йому можливість отримати доступ до вищезгаданої чатової кімнати.
Сет,

1
In bash, the "rc" files are actually run whether the shell is interactive or not. невірно. /etc/bash.bashrc спрацьовує /etc/bash.profile.
okwap

okwap правильно, rc-файли не викликаються в неінтерактивній оболонці, це більш лаконічно і точно.
Нік Аллен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.