Выбирать между ними.bashrc,.профиль.,профиль bash и т. д. [дубликат]

этот вопрос уже есть ответ здесь:

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

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

174
задан Avdi 2014-07-29 07:14:18
источник

6 ответов

TL; DR:

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

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

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

несколько другие Примечания:

  • все, что должно быть доступно графическим приложениям или sh (или bash вызывается как sh) должно быть ~/.profile

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

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

  • обеспечить ~/.bash_login не существует.

193
отвечен Dan Rabinowitz 2014-07-29 14:15:21
источник

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

требования:

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

  • переменные среды должны быть помещены в файл, который читается в обе консоли логины (т. е. "вход" Shell) и в графическом режиме (т. е. менеджеров как GDM, языка, или LXDM).

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

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

простой конфигурация:

  • Have a ~/.profile, который устанавливает все переменные окружения (кроме bash-specific ones), возможно, печатает строку или две, затем sources ~/.bashrc если управляется Баш, придерживаясь СХ-совместимый синтаксис иначе.

    export TZ="Europe/Paris"
    export EDITOR="vim"
    if [ "$BASH" ]; then
        . ~/.bashrc
    fi
    uptime
    
  • Have a ~/.bashrc, который выполняет любую настройку оболочки, защищенную проверкой на интерактивный режим чтобы не ломать вещи, как sftp в Debian (где bash компилируется с возможностью загрузки ~/.bashrc даже для неинтерактивной shells):

    [[ $- == *i* ]] || return 0
    
    PS1='\h \w $ '
    
    start() { sudo service "" start; }
    

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

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

    if ! [ "$PREFIX" ]; then   # or $EDITOR, or $TZ, or ...
        . ~/.environ           # generally any variable that .environ itself would set
    fi
    
  • к сожалению, для других дистрибутивов (например, Arch) я не нашел очень хорошего решения. Одной из возможностей является использование (по умолчанию включено) модуля pam pam_env, поместив следующее в ~/.pam_environment:

    BASH_ENV=./.environ        # not a typo; it needs to be a path, but ~ won't work
    

    потом, конечно, обновление ~/.environ для unset BASH_ENV.


вывод? Ракушки-это боль. Переменные окружения-это боль. Параметры компиляции для конкретного дистрибутива являются огромный боль в заднице.

46
отвечен grawity 2014-07-29 10:52:27
источник

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

для Bash они работают следующим образом. Прочтите соответствующую колонку. Выполняет 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
отвечен Flimm 2014-07-29 19:28:44
источник

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

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

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

19
отвечен Mechanical Fish 2014-07-29 17:53:34
источник

я отказался от попыток разобраться в этом и сделал один скрипт (~/.shell-setup) который я источник от всех остальных.

этот подход требует ~/.shell-setup есть две особенности:

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

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

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

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

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

0
отвечен ShadSterling 2017-05-23 15:41:38
источник

поставить все на .bashrc и затем source .bashrc с .profile

со страницы bash man (на OS X 10.9):

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

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

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

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

однако, вы не хотите, чтобы источник .bashrc с .profile безоговорочно. Пожалуйста см. комментарии и другое ответы на дополнительные вопросы.

-1
отвечен mattr- 2014-07-30 17:44:25
источник

Другие вопросы unix environment-variables

X