Почему в 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
Затем вы можете увидеть, что файловый дескриптор останавливается при открытии терминала.