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

    

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

    

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

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

162 голоса | спросил Avdi 29 J000000Tuesday14 2014, 07:14:18

6 ответов


185

TL; ДР:

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

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

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

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

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

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

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

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

ответил Dan Rabinowitz 29 J000000Tuesday14 2014, 08:27:48
45

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

Требования:

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

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

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

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

Простейшая конфигурация :

  • Имейте ~/.profile, который устанавливает все переменные среды (кроме специфичных для bash), возможно, печатает строку или две, затем источники ~/.bashrc if управляемый 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 с помощью опции source ~/.bashrc для таких неинтерактивных логинов. В этом случае я нашел полезным переносить все переменные среды (строки export ...) в отдельный файл, ~/.environ и в исходный код он из и .profile и .bashrc, с защитой, чтобы не делать этого дважды:

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

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

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


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

ответил Dan Rabinowitz 29 J000000Tuesday14 2014, 08:27:48
29

Посмотрите на это отличное сообщение в блоге 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      |           |      |
+----------------+-----------+-----------+------+
ответил Flimm 29 J000000Tuesday14 2014, 19:28:44
18

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

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

РЕДАКТИРОВАТЬ: Добавлены кавычки «всеобъемлющего» на случай, если кто-то соблазн поверить в это. ;)

ответил Mechanical Fish 29 J000000Tuesday14 2014, 07:39:54
0

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

Для этого подхода требуется ~/.shell-setup иметь две функции:

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

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

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

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

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

ответил ShadSterling 31 J000000Thursday14 2014, 06:45:18
-1

Поместите все в .bashrc, а затем source .bashrc из .profile

На странице пользователя 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. Дополнительную информацию см. В комментариях и других ответах.

ответил Matt Rogers 29 J000000Tuesday14 2014, 07:50:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132