четверг, 1 апреля 2010 г.

Файлы инициализации в Linux

Типы запуска командной оболочки


Interctive login shell запускается, когда пользователь входит в систему посредством ввода логина и пароля (выполняется скрипт /bin/login и введенный пароль проверяется посредством /etc/passwd).

Interactive non login shell запускается, когда пользователь запускает оболочку без ввода пароля:
* [prompt]/bin/bash --
* su username (без минуса копирует родительское окружение, с минусом не копирует)
* xterm, console из графического интерфейса

Файлы, выполняющиеся при запуске командной оболочки


  • /etc/profile -- запускается при любом входе в любую оболочку
  • ~/.bashrc -- вход без логина (например, родительская оболочка установлена в ksh, в ней мы вызываем bash командой. Если мы хотим инициализировать переменные, то делаем это в этом файле).
  • ~/.bash_profile -- вход с логином
  • /etc/bashrc -- обычно существует и вызывается из ~/.bashrc (вызов пишется ручками, см. ниже)
  • /etc/profile.d/*.sh -- вызывается из /etc/profile (вызов пишется ручками, см. ниже)


Взаимосвязи между файлами


На примере типичной конфигурации
1. ~/.bashrc вызывается из ~/.bash_profile. Если создавался пользователем самостоятельно, то этого важного вызова может и не быть
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

2. /etc/bashrc из ~/.bashrc
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

3. /etc/profile.d/*.sh из /etc/profile
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
done


4. /etc/profile.d/*.sh из /etc/bashrc
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
done


Тестирование запуска оболочек



Добавим в указанные выше файлы /etc/profile, ~/.bash_profile, ~/.bashrc, /etc/bashrc, /etc/profile.d/testbash.sh строчку с заполнением название скрипта в лог. Строка добавлена в конец файла, так что при вызове другого файла сначала появляется запись о другом файле, потом о текущем

При обычном входе с логином паролем


script name: /etc/profile.d/testbash.sh
script name: /etc/profile
script name: /etc/bashrc
script name: roots .bashrc
script name: roots .bash_profile


su - Запуск без сохранения окружения


script name: /etc/profile.d/testbash.sh
script name: /etc/profile
script name: /etc/bashrc
script name: roots .bashrc
script name: roots .bash_profile


su Запуск с сохранением окружения


script name: /etc/profile.d/testbash.sh
script name: /etc/bashrc
script name: roots .bashrc


Запуск скрипта


#!/bin/bash
echo Hello
ПУСТО

Запуск другой оболочки /bin/ksh


ПУСТО

Запуск /bin/bash


script name: /etc/profile.d/testbash.sh
script name: /etc/bashrc
script name: oracles .bashrc


Выводы


Лучше всего окружение настраивать в .bashrc, убедившись, что в .bash_profile есть ссылка на .bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi


За более подробной информацией: info bash
По материалам статьи http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Комментариев нет: