/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.)
Таким чином, і "профіль", і "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."
Подальше читання