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

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

Это смущает, но после многих лет использования систем 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. Не генерировать нежелательные выходные данные (определять, когда выходные данные в порядке)

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

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

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

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

Связанный контент