Это смущает, но после многих лет использования систем POSIX на постоянной основе мне все еще трудно понять, должна ли настройка оболочки идти в .bashrc
, .profile
, или где-то еще. Не говоря уже о некоторых специфичных для ОС файлах конфигурации, таких как .pam_environment
.
Да, я знаю, как разобраться в документации и узнать, когда каждый файл загружен, а когда нет. Мне интересно, есть ли у кого-нибудь всеобъемлющие руководства, как решить, в какой файл поместить тот или иной тип настройки.
решение1
TL;DR:
~/.bash_profile
должно быть очень простым и просто загружать.profile
и.bashrc
(именно в таком порядке)~/.profile
содержит информацию, НЕ связанную конкретно с bash, например переменные окружения (PATH
и т.п.)~/.bashrc
есть все, что вам нужно в интерактивной командной строке. Командная строка,EDITOR
переменная, псевдонимы bash для моего использования
Еще несколько заметок:
Все, что должно быть доступно графическим приложениям ИЛИ sh (или bash, вызываемому как
sh
), ДОЛЖНО быть в~/.profile
~/.bashrc
не должно ничего выводитьВсе, что должно быть доступно только для оболочек входа, должно быть включено
~/.profile
Убедитесь, что этого
~/.bash_login
не существует.
решение2
За последние несколько лет у меня было много времени, которое я мог потратить впустую, поэтому яиметьисследовал это немного больше, чем просто 10 минут. Я понятия не имею, является ли это лучшим макетом, это просто тот, который работает правильно почти во всех случаях.
Требования:
~/.profile
должен быть совместим с любым /bin/sh – включая bash, dash, ksh и любым другим дистрибутивом, который он может использовать.Переменные среды должны быть помещены в файл, который читается как консольными входами (т. е. оболочкой «входа»), так и графическими входами (т. е. менеджерами отображения, такими как GDM, LightDM или LXDM).
Очень мало смысла в том, чтобы иметьоба
~/.profile
и~/.bash_profile
. Если последний отсутствует, bash с радостью использует первый, а любые специфичные для bash строки можно защитить проверкой на$BASH
или$BASH_VERSION
.Разделение между
*profile
и*rc
заключается в том, что первый используется для оболочек 'login', а второй каждый раз, когда вы открываете окно терминала. Однако bash в режиме 'login' не использует source~/.bashrc
, поэтому~/.profile
необходимо сделать это вручную.
TheпростейшийКонфигурация будет следующей:
Иметь
~/.profile
, который устанавливает все переменные окружения (кроме специфичных для bash), возможно, выводит одну-две строки, а затем источники,~/.bashrc
если они запущены bash, в противном случае придерживаясь sh-совместимого синтаксиса.экспорт TZ="Европа/Париж" экспорт РЕДАКТОР="vim" если [ "$BASH" ]; тогда . ~/.bashrc фи время безотказной работы
Иметь ,
~/.bashrc
который выполняет любую настройку, специфичную для оболочки, защищенную проверкойинтерактивный режимчтобы избежать поломок, какsftp
в Debian (где bash скомпилирован с возможностью загрузки~/.bashrc
даже для неинтерактивных оболочек):[[ $- == *i* ]] || вернуть 0 PS1='\ч \в \$ ' start() { sudo service "$1" start; }
Однако существует также проблема, заключающаяся в том, что некоторые неинтерактивные команды (например, ssh <host> ls
) пропускают ~/.profile
, но переменные окружения были бы для них очень полезны.
Некоторые дистрибутивы (например, Debian) компилируют свой bash с опцией source
~/.bashrc
для таких неинтерактивных входов. В этом случае я обнаружил, что полезно переместить все переменные окружения (строкиexport ...
) в отдельный файл,~/.environ
и source изоба.profile
и.bashrc
, с защитой, чтобы не делать это дважды:если ! [ "$ПРЕФИКС" ]; тогда # или $EDITOR, или $TZ, или ... . ~/.окружение # в общем случае любая переменная, которую .environ сам установит фи
К сожалению, для других дистрибутивов (например, Arch) я не нашел очень хорошего решения. Одна из возможностей — использовать (включенный по умолчанию) модуль PAM pam_env, поместив следующее в
~/.pam_environment
:BASH_ENV=./.окружение # это не опечатка; это должен быть путь, но ~ не будет работать
Затем, конечно, обновление
~/.environ
доunset BASH_ENV
.
Вывод? Оболочки — это боль. Переменные окружения — это боль. Параметры компиляции, специфичные для дистрибутива, — это боль.огромныйзаноза в заднице.
решение3
Посмотри на этоотличный пост в блоге ShreevatsaR. Вот отрывок, но перейдите к записи в блоге, там есть объяснение таких терминов, как «оболочка входа», блок-схема и аналогичная таблица для Zsh.
Для Bash они работают следующим образом. Прочитайте соответствующий столбец. Выполняет A, затем B, затем C и т. д. B1, B2, B3 означает, что он выполняет только первый из найденных файлов.
Интерактивный вход Интерактивный без входа в систему Сценарий /etc/profile
А /etc/bash.bashrc
А ~/.bashrc
Б ~/.bash_profile
В1 ~/.bash_login
Би 2 ~/.profile
В3 BASH_ENV
А ~/.bash_logout
С
решение4
Я отказался от попыток разобраться в этом вопросе и создал один скрипт ( ~/.shell-setup
), который я взял из всех остальных.
Этот подход требует ~/.shell-setup
наличия двух особенностей:
- Запустите только один раз, даже если источник используется повторно (используйтеВключить охранников)
- Не генерировать нежелательные выходные данные (определять, когда выходные данные в порядке)
#1 довольно стандартен, хотя, возможно, нечасто используется в скриптах оболочки.
#2 сложнее. Вот что я использую в bash:
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
К сожалению, я не помню, как я это придумал и почему.обнаружение интерактивной оболочкибыло недостаточно.