Какова цель .bashrc и как она работает?

Ответы:

131

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

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

.bashrcзапускается при каждом запуске интерактивной оболочки. Если вы говорите:

$ bash ; bash ; bash

а затем ударил Ctrl-Dтри раза, .bashrcбудет работать три раза. Но если вы скажете это вместо:

$ bash -c exit ; bash -c exit ; bash -c exit

тогда .bashrcне будет работать вообще, так как -cделает вызов Bash неинтерактивным. То же самое верно, когда вы запускаете сценарий оболочки из файла.

Контраст .bash_profileи .profileкоторые запускаются только в начале новой оболочки входа в систему. ( bash -l) Вы выбираете, будет ли команда идти .bashrcпротив, в .bash_profileзависимости от того, хотите ли вы запустить ее один раз или для каждого запуска интерактивной оболочки.

В качестве контрпримеров к псевдонимам, которые я предпочитаю использовать .bashrc, вместо этого вы хотите внести PATHкоррективы .bash_profile, поскольку эти изменения обычно не являются идемпотентными :

export PATH="$PATH:/some/addition"

Если вы добавите это .bashrcвместо этого, каждый раз, когда вы запускаете интерактивную вложенную оболочку, она :/some/additionснова будет привязана к концу PATH, создавая дополнительную работу для оболочки при неправильном вводе команды.

Вы получаете новый интерактивный Bash оболочки , когда вы обстреливать изvi с :sh, например.

Уоррен Янг
источник
6
Незначительный каламбур: в отличии от большинства других оболочек, Баш ли не автоматически загружает конфигурационный файл для каждого, например , .bashrcкогда он начал в качестве оболочки. Иногда это может привести к неожиданному поведению . Обычным решением является источником .bashrcс .profileили .bash_profileвместо этого.
Илмари Каронен
@IlmariKaronen Так .bashrcкак не предназначен для использования другими оболочками, лучше не брать его из источника .profile(который может использоваться другими не bashоболочками).
chepner
@IlmariKaronen то , что происходит (читай: как я могу отладить почему) , когда source ~/.bashrcили . ~/.bashrcили [[ -f ~/.bashrc ]] && source. ~/.bashrcили [ -f ~/.bashrc ] && source ~/.bashrcне работают?
Никос Александрис
@NikosAlexandris: Это отдельный вопрос. Пожалуйста, спросите это отдельно .
Уоррен Янг
@WarrenYoung Я бы, но я понял, что .bashrcэто действительно источник (с использованием рекомендуемой команды от superuser.com/a/183980/128768 ). Проблема я лицо фактически не сорсинг с https://github.com/junegunn/fzfпомощью этой команды внутри .bashrc: source ~/.fzf.bash. Я запускаю новый терминал, потом Ctrl+ Rи получаю `__fzf_history__`bash: fzf: command not found. Я использую источник вручную, .bashrcи тот же самый ярлык запускает fzf, как и ожидалось. Извинения за шум здесь.
Никос Александрис
20

Назначение .bashrcфайла - предоставить место, где вы можете установить переменные, функции и псевдонимы, определить приглашение (PS1) и определить другие параметры, которые вы хотите использовать при каждом запуске, когда вы открываете новое окно терминала.

Он работает, будучи запущенным каждый раз, когда вы открываете новый терминал, окно или панель.

Вы можете увидеть мой здесь (рис с подсветкой синтаксиса) :

HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000
ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
md () { [ $# = 1 ] && mkdir -p "$@" && cd "$@" || echo "Error - no directory passed!"; }
git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'
set -o vi # vi at command line
export EDITOR=vim
test -f ~/.bash_aliases && . $_
test -f ~/.git-completion.bash && . $_
test -s ~/.autojump/etc/profile.d/autojump && . $_
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
[ -z $TMUX ] && export TERM=xterm-256color && exec tmux
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$home/.rvm/scripts/rvm"

Объяснение:

-1. Настройте мой файл истории, чтобы игнорировать дубликаты и быть намного больше, чем по умолчанию.
-2. Вариант цвета в lsзависимости от того, используете ли вы linux или OSX
-3. Функция " md" сделать и перейти в каталог с помощью одной команды
-4. Найти текущую ветку git, если в git repo и ...
-5. -9. Определите удивительное приглашение PS1, как в <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / мастер компоновщика \ n $ _ </ code>
-10. Улучшена подсказка PS2
-11. Установите vi в качестве редактора в командной строке
-12. Установите vi как редактор по умолчанию
-13. выполнить мой .bash_aliasesфайл, если он существует
-14. Выполните мой скрипт завершения git tab (для удаленных и филиалов), если он существует.
-15. Выполнить автопрыжок, если он существует
-16. Разрешить cd'ing без ввода части cd, если версия bash> = 4
-17. Выполнить скрипт завершения bash, если он существует
-18. Используйте TMUX, если он присутствует
-19. Добавить рвм в мой путь
-20. Используйте rvm, если он существует.

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

Это также облегчает немедленное использование всего файла на новом компьютере без проблем, которые влияют на открытие нового окна терминала.

Майкл Даррант
источник
Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier
да? слишком полезно для вас?
Майкл Даррант
2
Большое спасибо, что поделились. Куча информации здесь.
Vic
7

Это bashфайл конфигурации.

Интерактивные (не входящие в систему) оболочки, затем конфиг читается из этих файлов:

  • $HOME/.bashrc

Для Оболочек входа в систему конфигурация читается из этих файлов:

  • /etc/profile (Всегда с источником)
  • $HOME/.bash_profile (остальные файлы проверяются по порядку, пока один не найден, остальные не читаются)
  • $HOME/.bash_login
  • $HOME/.profile

Простая иллюстрация того, как / когда они загружены, представлена ​​на рисунке ниже.

Я добавил echoк моему .bashrcи.bash_profile

Интерактивная оболочка против оболочки входа

см. man bashдля получения дополнительной информации

Тимоти Л.Дж. Стюарт
источник
2
Это не добавляет дополнительной ценности к старому вопросу. Кроме того, я вижу, что вы новичок в Unix и Linux, старайтесь не публиковать картинки текста, вместо этого лучше использовать форматирование блока кода и копировать его с консоли. Это позволяет искать текст / копировать / и т.д. В случае вашего примера на самом деле нет никаких сложных команд или чего-либо, что было бы полезно искать, но хорошая практика для других ответов.
Сентиман
1
Я не уверен, что полностью понимаю вашу ссылку на «старый вопрос». Он находится в верхнем списке вопросов и имеет отношение к просмотрам 60 тыс. Я думал, что добавленная ценность прибыла из формата, в противоположность диалогу / предположению как предыдущие ответы. но формат был также отредактирован. Я буду помнить ваши комментарии об использовании блоков кода, спасибо.
Тимоти Л.Дж. Стюарт
2
Он находится в верхней части списка активных вопросов, потому что вы опубликовали ответ. Вопрос был изначально задан в 2014 году и принял ответ. В принятом ответе указывается цель .bashrcи различие между содержанием вашего ответа .bashrcи .bash_profileего содержанием. Не отчаивайтесь, вы прилагаете честные усилия, но старайтесь сосредоточиться на ответах на вопросы с некоторым содержанием, не покрытым другими ответами.
Сентиман