/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
."
Подальше читання