Почему исходный файл ~ / .profile по умолчанию Ubuntu ~ / .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, и я видел различные системы, где этого не произошло, поэтому я предполагаю, что у них, должно быть, были веские причины. Это может привести к неожиданному поведению при запуске оболочек входа (например, когда sshing в машину, например), где пользователь не ожидал, что будет получен источник ~/.bashrc .

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

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

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

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

    Теперь наивное решение этой проблемы заключается в том, что вместо запуска «xterm» он мог настроить свой оконный менеджер на запуск «xterm -ls». Этот флаг сообщает xterm, что вместо запуска нормальной оболочки он должен запустить оболочку входа. В этой настройке xterm spawns / 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 или «execing» оконного менеджера. Однако есть один потенциальный недостаток этого подхода: под xdm оболочка, которая читает .xsession, работает без управляющего терминала. Если либо / etc / profile, либо .bash_profile использует любые команды, которые предполагают наличие терминала (например, «состояние» или «stty»), эти команды могут выйти из строя. Это основная причина, по которой xdm не считывает эти файлы по умолчанию. Если вы собираетесь использовать этот подход, вы должны убедиться, что все команды в ваших «точечных файлах» безопасны для запуска, когда нет терминала.

    Это стандартное поведение Ubuntu, ~/.bashrc – это начальный файл на уровне пользователя для каждого интерактивного ядра. Когда вы открываете терминал в основном, вы запускаете не-login, интерактивную оболочку, которая читает ~/.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
      set -x 

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