Почему в Ubuntu по умолчанию ~/.profile источник ~/.bashrc?

Это содержимое акции ~/.profile это пришло с моим 13.10 (закомментированные строки удалены):

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Это унаследовано от Debian, но почему Canonical решила оставить его? Насколько я знаю, это не стандартный способ * nix, и я видел различные системы, где этого не произошло, поэтому я предполагаю, что у них, должно быть, были на то веские причины. Это может привести к неожиданному поведению при запуске оболочек входа в систему (например, при подключении к компьютеру), когда пользователь не ожидает, что ~/.bashrc источники.

Единственное преимущество, которое я могу придумать, - это не путать пользователя со многими файлами запуска и разрешать им редактировать .bashrc в одиночку и иметь это читать независимо от типа оболочки. Это, однако, сомнительное преимущество, так как часто бывает полезно иметь разные настройки для входа в систему и для интерактивных оболочек, и это блокирует вас от этого. Кроме того, оболочки входа в систему очень часто не запускаются в графической среде, и это может вызвать ошибки, предупреждения и проблемы (о боже!) В зависимости от того, что вы установили в этих файлах.

Так почему же Ubuntu делает это, чего мне не хватает?

2 ответа

Решение

Это исходное решение от Debian. Обоснование этого объясняется в этом очень хорошем вики-посте, выдержка которого приведена ниже. Резюме сводится к тому, чтобы "гарантировать, что логины GUI и не GUI работают одинаково":

Давайте возьмем xdm в качестве примера. Однажды Пьер возвращается из отпуска и обнаруживает, что его системный администратор установил xdm в систему Debian. Он просто входит в систему, и xdm читает его файл.xsession и запускает fluxbox. Кажется, все в порядке, пока он не получит сообщение об ошибке в неправильной локали! Поскольку он переопределяет переменную LANG в своем.bash_profile, а xdm никогда не читает.bash_profile, его переменная LANG теперь установлена ​​в en_US вместо fr_CA.

Теперь наивное решение этой проблемы состоит в том, что вместо запуска "xterm" он может настроить свой оконный менеджер на запуск "xterm -ls". Этот флаг сообщает xterm, что вместо запуска обычной оболочки следует запустить оболочку входа в систему. При такой настройке xterm порождает /bin/bash, но в вектор аргумента помещает "-/bin/bash" (или, может быть, "-bash"), поэтому bash действует как оболочка входа в систему. Это означает, что каждый раз, когда он открывает новый xterm, он будет читать /etc/profile и.bash_profile (встроенное поведение bash), а затем.bashrc (потому что.bash_profile говорит об этом). На первый взгляд может показаться, что это работает нормально - его точечные файлы не тяжелые, поэтому он даже не замечает задержки - но есть более тонкая проблема. Он также запускает веб-браузер непосредственно из своего меню fluxbox, и веб-браузер наследует переменную LANG от fluxbox, который теперь настроен на неправильную локаль. Таким образом, хотя его xterms могут быть в порядке, и все, что запускается из его xterms, может быть в порядке, его веб-браузер по-прежнему предоставляет ему страницы в неправильной локали.

Итак, что является лучшим решением этой проблемы? Там действительно нет универсального. Лучше всего изменить файл.xsession так, чтобы он выглядел примерно так:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

Это заставляет оболочку, которая интерпретирует скрипт.xsession, читать в /etc/profile и.bash_profile, если они существуют и доступны для чтения, перед запуском xmodmap или xterm или "выходом" из оконного менеджера. Однако у этого подхода есть один потенциальный недостаток: в xdm оболочка, которая читает.xsession, работает без управляющего терминала. Если в /etc/profile или.bash_profile используются какие-либо команды, предполагающие наличие терминала (например, "fortune" или "stty"), эти команды могут завершиться с ошибкой. Это основная причина, почему xdm не читает эти файлы по умолчанию. Если вы собираетесь использовать этот подход, вы должны убедиться, что все команды в ваших "точечных файлах" безопасны для выполнения, когда нет терминала.

Это стандартное поведение Ubuntu, ~/.bashrc файл запуска на уровне пользователя для каждой интерактивной оболочки. Когда вы в основном открываете терминал, вы запускаете интерактивную оболочку без логина, которая читает ~/.bashrc и содержание ~/.bashrc получить и экспортировать в вашу текущую оболочку. Это помогает получить все свои пользовательские переменные и функции оболочки в текущей оболочке. Также вы можете найти такие строки

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

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

Это важно для обеспечения хорошего пользовательского опыта. Например, можно хранить учетные данные прокси в .bashrc, если это не получено ни одно из терминальных приложений (а именно, ping, wget, curl, lynx и т. д.) будет работать правильно. Или вы должны предоставлять учетные данные прокси каждый раз, когда открываете терминал.

Помимо Ubuntu по умолчанию .bashrc содержит много псевдонимов (для ls а также grep для печати цветного вывода), много новых определений для различных переменных оболочки, что увеличивает пользовательский опыт.

Но в случае входа в систему через ssh или входа в виртуальную консоль, вы в основном получаете интерактивную оболочку входа. Там файл инициализации оболочки ~/.profile, Следовательно, если вы не источник ~/.bashrc вы пропустите все эти полезные настройки в вашем .bashrc, Вот почему Ubuntu по умолчанию ~/.profile источник ~/.bashrc

Дело, чтобы избежать

  • вы никогда не должны источник ~/.profile форма внутри ~/.bashrc в то же время, когда ~/.bashrc поступает из ~/.profile, Это создаст бесконечный цикл ситуации, и в результате ваш запрос терминала будет приостановлен, если вы не нажмете Ctrl + C. В такой ситуации, если вы поставите строку в ~/.bashrc
 установить -x 

Затем вы можете увидеть, что файловый дескриптор останавливается при открытии терминала.

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