О .bash_profile,.bashrc и где должен быть написан псевдоним?

Возможный дубликат: В чем разница между .bashrc,.bash_profile и .environment?

Кажется, что если я использую

alias ls='ls -F'

внутри .bashrc в Mac OS X, то только что созданная оболочка не будет иметь этот псевдоним. Мне нужно снова набрать bash, и этот псевдоним будет действовать.

И если я войду в Linux на хостинговой компании, в файле .bashrc будет строка комментариев, в которой говорится:

Для оболочки без входа

а файл .bash_profile содержит комментарий, в котором говорится

для оболочки входа

Итак, где должны быть написаны псевдонимы? Почему мы разделяем оболочку входа и оболочку без входа?

Некоторые веб-страницы говорят, что используйте .bash_aliases, но это не работает на Mac OS X. Кажется.

Ответ 1

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

Лично

  • Я поместил мою установку PATH в файл .profile (потому что иногда я использую другие оболочки);
  • Я помещаю свои псевдонимы и функции Bash в свой .bashrc файл;
  • Я положил это

    #!/bin/bash
    #
    # CRM .bash_profile Time-stamp: "2008-12-07 19:42"
    #
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # get my PATH setup
    source ~/.bashrc  # get my Bash aliases
    

    в моем .bash_profile файле.

О, и причина, по которой вам нужно снова набрать bash, чтобы получить новый псевдоним, заключается в том, что Bash загружает ваш файл .bashrc, когда он запускается, но он не перезагружает его, если вы не сообщите об этом. Вы можете перезагрузить файл .bashrc (и не нуждаться в второй оболочке), набрав

source ~/.bashrc

который загружает файл .bashrc, как если бы вы набрали команды непосредственно на Bash.

Ответ 2

Посмотрите http://mywiki.wooledge.org/DotFiles за отличный ресурс по теме, кроме man bash.

Резюме:

  • Вы регистрируетесь только один раз и когда ~/.bash_profile или ~/.profile считывается и выполняется. Поскольку все, что вы запускаете из своей оболочки входа, наследует среду оболочки входа, вы должны поместить все переменные среды там. Как LESS, PATH, MANPATH, LC_*,... Пример: My .profile
  • После входа в систему вы можете запустить еще несколько оболочек. Представьте, что вы вошли в систему, запустили X, а в X запустили несколько терминалов с оболочками bash. Это означает, что ваша оболочка входа в систему была запущена X, которая унаследовала переменные окружения оболочки входа в систему, которые запустили ваши терминалы, которые запустили ваши оболочки без входа bash. Ваши переменные среды были переданы по всей цепочке, поэтому вам не нужно загружать их не-login-оболочки. Для этой неподверженной причины для команд, не входящих в систему, выполните ~/.bashrc, а не /.profile или ~/.bash_profile, поэтому в нем определите все, что применимо только к bash. Это функции, псевдонимы, bash - только такие переменные, как HISTSIZE (это не переменная среды, не экспортируйте ее!), параметры оболочки с set и shopt и т.д. Для пример: My .bashrc
  • Теперь, как часть уникальности UNIX, login-shell НЕ выполняет ~/.bashrc, а только ~/.profile или ~/.bash_profile, поэтому вы должны указать его вручную из последнего. Вы увидите, что я тоже делаю это в моем ~/.profile: source ~/.bashrc.

Ответ 3

Из bash manpage:

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

Когда оболочка входа завершается, bashсчитывает и выполняет команды из файл ~/.bash_logout, если он существует.

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

Таким образом, если вы хотите получить одинаковое поведение для обеих оболочек входа и интерактивных оболочек без входа, вы должны поместить все свои команды в .bashrc или .bash_profile, а затем иметь другой файл source первый.

Ответ 4

.bash_profile загружается для "оболочки входа". Я не уверен, что это будет на OS X, но на Linux, которая является либо X11, либо виртуальным терминалом.

.bashrc загружается каждый раз при запуске Bash. Вот где вы должны поместить вещи, которые хотите загрузить, всякий раз, когда вы открываете новое окно Terminal.app.

Я лично поместил все в .bashrc, чтобы мне не пришлось перезапускать приложение, чтобы изменения вступили в силу.