Вопрос Выбор между .bashrc, .profile, .bash_profile и т. Д. [Duplicate]


На этот вопрос уже есть ответ:

Это смущает, но после многих лет использования систем POSIX полный рабочий день мне все еще сложно понять, нужно ли настраивать оболочку .bashrc, .profile, или где-то еще. Не говоря уже о некоторых конфигурационных файлах для ОС, таких как .pam_environment,

Да, я знаю, как разгадать документацию и узнать, когда каждый файл загружен или не загружен. Мне интересно, может ли кто-нибудь из вас составить исчерпывающие рекомендации о том, как решить, какой файл следует использовать для данного типа настройки.


169
2017-07-29 03:14


происхождения


этот вопрос не должен быть помечен как дубликат, причина в том, что .profile недоступен в добавленном вопросе. - Premraj
Ans: serverfault.com/q/261802/270464 - Premraj


ответы:


TL; DR:

  • ~/.bash_profile должен быть суперпростым и просто загружать .profile а также .bashrc (в этой последовательности)

  • ~/.profile имеет материал НЕ конкретно связанные с bash, такие как переменные среды (PATH и друзья)

  • ~/.bashrc есть что угодно в интерактивной командной строке. Командная строка, EDITOR переменная, bash aliases для моего использования

Несколько других примечаний:

  • Все, что должно быть доступно для графических приложений ИЛИ для sh (или bash, вызванных как sh) ДОЛЖНЫ быть в ~/.profile

  • ~/.bashrc не должен выводить ничего

  • Все, что должно быть доступно только для систем входа в систему, должно ~/.profile

  • Гарантировать, что ~/.bash_login не существует.


190
2017-07-29 04:27



+1, это позволяет ~/.profile правильно настроить среду для таких сервисов, как GDM / LightDM / LXDM, которые явно запускают / bin / sh. - grawity
мой .bashrc выдает довольно много материала, можете ли вы прокомментировать это? В частности, где я должен поставить вывод приветствия? - Calimo
@Calimo: Сделать это только выходным материалом в интерактивном режиме. Вы можете проверить это, используя [[ $- == *i* ]], то есть поиск «i» в специальном $- переменная. Конечно, это имеет значение только в первую очередь в системах, где bash компилируется для чтения .bashrc в неинтерактивном режиме. (То есть Debian, но не Arch.) Но это частая причина таинственных сообщений об ошибках при попытке подключения с использованием sftp или scp или аналогичные инструменты. - grawity
Теперь я должен знать - почему бы .bash_login не существовать? Что оно делает? - tedder42
@ tedder42: Он делает то же самое, что и .bash_profile а также .profile, Но Баш только читает первый из трех. Смысл, если у вас есть .bash_login, то оба .profile а также .bash_profile будут таинственно проигнорированы. - grawity


За последние несколько лет у меня было много времени, чтобы тратить, поэтому я иметь исследовал это чуть более 10 минут. Я понятия не имею, является ли это наилучшим макетом, это всего лишь один, который работает правильно в почти всех случаях.

Требования:

  • ~/.profile должен быть совместим с любым / bin / sh - это включает в себя bash, dash, ksh, все, что может выбрать дистрибутив.

  • Переменные среды должны быть помещены в файл, который считывается с помощью обоих консольных входов (то есть оболочки «login») и графических логинов (например, менеджеров отображения, таких как GDM, LightDM или LXDM).

  • Очень мало смысла иметь и то и другое  ~/.profile а также ~/.bash_profile, Если последнее отсутствует, bash с радостью будет использовать первое, и любые строки, связанные с bash, могут быть защищены с помощью проверки $BASH или $BASH_VERSION,

  • Разделение между *profile а также *rc заключается в том, что первый используется для оболочек «login», а второй - при каждом открытии окна терминала. Однако bash в режиме «входа» не является источником ~/.bashrc, следовательно ~/.profile необходимо сделать это вручную.

самый простой Конфигурация будет:

  • Имейте ~/.profile который устанавливает все переменные среды (кроме специфичных для bash), возможно печатает строку или две, затем источники ~/.bashrc если он управляется bash, в противном случае придерживается синтаксиса sh-compatible.

    экспорт TZ = "Европа / Париж"
    экспорт EDITOR = "vim"
    если ["$ BASH"]; тогда
        , ~ / .bashrc
    фи
    Провел
    
  • Имейте ~/.bashrc который выполняет любую настройку, специфичную для оболочки, с проверкой на наличие интерактивный режим чтобы не нарушать такие вещи, как sftp на Debian (где bash скомпилирован с возможностью загрузки ~/.bashrcдаже для неинтерактивных оболочек):

    [[$ - == * i *]] || возвращение 0
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo service "$ 1" start; }
    

Однако существует также проблема, что некоторые неинтерактивные команды (например, ssh <host> ls) пропускать ~/.profile, но переменные среды были бы очень полезны для них.

  • Некоторые дистрибутивы (например, Debian) компилируют свой bash с возможностью источника ~/.bashrc для таких неинтерактивных логинов. В этом случае я нашел полезным переносить все переменные среды ( export ... строки) в отдельный файл, ~/.environ, и исправить его из и то и другое  .profile а также .bashrc, с охранником, чтобы не делать этого дважды:

    если ! ["$ PREFIX"]; тогда # или $ EDITOR, или $ TZ, или ...
        , ~ / .environ # вообще любая переменная, которая сама установила .environ
    фи
    
  • К сожалению, для других дистрибутивов (например, Arch) я не нашел очень хорошего решения. Одна из возможностей - использовать модуль (pam_env PAM) (включен по умолчанию), поставив следующее в ~/.pam_environment:

    BASH_ENV =. /. Environ # не опечатка; это должен быть путь, но ~ не будет работать
    

    Тогда, конечно, обновление ~/.environ в unset BASH_ENV,


Вывод? Оболочки - это боль. Переменные среды - это боль. Параметры времени компиляции, определенные для распространения, являются огромный боль в заднице.


45
2017-07-29 15:28



+1 для последнего абзаца, но я предпочитаю поиск .profile а также .bashrc из .bash_profile и поддержание .profile чистый. - nyuszika7h
@ nyuszika7h: Мой .profile  чистый, благодаря. - grawity
Обратите внимание на комментарий re каждый раз, когда вы открываете окно, это наоборот для OSX - Mark
«Очень мало смысла иметь как ~/.profile а также ~/.bash_profile»: Я не согласен. См. Ответ Дэна для чего. - rubenvb
@rubenvb Можете ли вы привести соответствующую часть? Я думаю, что хорошо иметь только .profile и охранять bash-специальные части с условными обозначениями. - Kelvin


Посмотри на это отличное сообщение в блоге от ShreevatsaR, Вот выдержка, но перейдите к сообщению в блоге, в нем есть объяснение терминов типа «оболочка входа», блок-схема и аналогичная таблица для Zsh.

Для Баша они работают следующим образом. Прочитайте соответствующую колонку. Выполняет A, затем B, затем C и т. Д. B1, B2, B3 означает, что он выполняет только первый из найденных файлов.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

29
2017-07-29 03:39



Это мило. Важно отметить, что обычно /etc/profile звонки /etc/bash.bashrc, а также ~/.profile звонки ~.bashrc, Так эффективно, /etc/bash.bashrc а также ~/.bashrc выполняются также для интерактивных логинов. - wisbucky
Обратите внимание, что некоторые дистрибутивы, похоже, переопределяют эту схему (со странными последствиями) - см., Например, мой bugreport, чтобы открыть здесь: bugzilla.opensuse.org/show_bug.cgi?id=1078124 - Christian Herenz


Я предлагаю вам свои «всеобъемлющие» рекомендации:

  • Делать .bash_profile а также .profile нагрузка .bashrc если он существует, используя, например, [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Поместите все остальное в .bashrc,
  • Перестань беспокоиться.
  • Каждые четыре года или около того, потратьте десять минут на изучение этого самого вопроса, прежде чем отказаться и вернуться к «не беспокоиться».

EDIT: Добавлены кавычки «всеобъемлющего» на случай, если кто-то соблазн поверить в это. ;)


19
2017-07-31 02:45



Имея оба .bash_profile а также .profile немного избыточно; вам нужно только последнее. Вам нужно сделать это / bin / sh-proof, хотя: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi, так как существуют программы (а именно gdm / lightdm), которые вручную отправляют файл из сценария / bin / sh. Это также означает, что окружающая среда .bashrc будет неэффективным. Пришлось до -1, так как ваши «всеобъемлющие» рекомендации не будут работать во многих системах, поскольку я обнаружил трудный путь несколько раз. - grawity
Нет проблем, я бы с радостью заплатил -1 за ответ, который не был просто щекотливым «всеобъемлющим», и вы наверняка заработали этот титул. - Mechanical Fish


Я отказался от попыток понять это и сделал один сценарий (~/.shell-setup), который я исхожу из всех остальных.

Такой подход требует ~/.shell-setup иметь две функции:

  1. Выполняйте только один раз, даже если вы повторно используете его (используйте Включить стражи)
  2. Не генерируйте нежелательный выход (обнаруживайте, когда выход в порядке)

# 1 довольно стандартно, хотя, возможно, не очень много используется в сценариях оболочки.

# 2 сложнее. Вот что я использую в bash:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

К сожалению, я не помню, как я это придумал, или почему обнаружение интерактивной оболочки было недостаточно.


0
2017-07-29 03:50





Положите все .bashrc и затем источник .bashrc из .profile

На странице man bash (на OS X 10.9):

Когда запущена интерактивная оболочка, которая не является оболочкой входа, bash считывает и выполняет команды из ~ / .bashrc, если этот файл существует. Это может быть заблокировано с помощью параметра --norc. Параметр файла -rcfile заставит bash читать и выполнять команды из файла вместо ~ / .bashrc

Вышеприведенный текст - вот почему все .bashrc, Тем не менее, есть немного другое поведение, когда вы имеете дело с оболочкой входа. Опять же, цитируя со страницы man:

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login, она сначала считывает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в этом порядке и считывает и выполняет команды из первого, который существует и доступен для чтения. Опция -noprofile может использоваться, когда оболочка начинает блокировать это поведение.

.profile считывается для систем входа, но .bashrc не является. Дублирование всего этого в .bashrc это плохо, поэтому нам нужно .profile чтобы поведение оставалось непротиворечивым.

Однако вы не хотите, чтобы источник .bashrc из .profile безусловно. Дополнительную информацию см. В комментариях и других ответах.


-1



-1, НЕ источник .bashrc из .profile, См. Ответ @ DanRabinowitz. - nyuszika7h
По крайней мере, не безоговорочно. - nyuszika7h
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc будет сладким oneliner для .profile, - John WH Smith
@ nyuszika7h, Почему бы и нет? Кажется, все предложить это сделать. - Pacerier