Яке призначення .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
Незначні підказки: на відміну від більшості інших оболонок, bash автоматично не завантажує конфігураційний файл для кожного примірника, .bashrcколи він запускається як оболонка для входу. Це іноді може призвести до несподіваної поведінки . Звичайний спосіб вирішення - джерело .bashrcз .profileабо .bash_profileзамість цього.
Ільмарі Каронен

@IlmariKaronen Оскільки .bashrcвін не призначений для використання іншими оболонками, краще не джерело його .profile(який може використовуватися іншими не bashоболонками).
чепнер

@IlmariKaronen то , що відбувається (читай: як я можу налагодити чому) , коли source ~/.bashrcабо . ~/.bashrcчи [[ -f ~/.bashrc ]] && source. ~/.bashrcабо [ -f ~/.bashrc ] && source ~/.bashrcне працюють?
Нікос Олександріс

@NikosAlexandris: Це окреме питання. Будь ласка, запитайте його окремо .
Warren Young

@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 / masterer \ n $ _ </code>
-10. Поліпшене підказка PS2
-11. Встановіть vi в якості редактора в командному рядку
-12. Встановіть vi як редактор за замовчуванням
-13. виконати мій .bash_aliasesфайл, якщо він існує
-14. Виконати мій сценарій завершення вкладки git (для віддалених та гілок), якщо він існує.
-15. Виконати автоперетворювач, якщо він існує
-16. Дозволити cd'ing, не набираючи частину CD, якщо версія bash> = 4
-17. Виконати скрипт завершення bash, якщо він існує
-18. Використовуйте TMUX, якщо він присутній
-19. Додайте rvm до мого ПАТ-
20. Використовуйте rvm, якщо він існує.

Я зробив цей портативний, щоб він працював на будь-якій моїй версії Linux або OSX без налаштування - отже, перед використанням певних функцій та інших сценаріїв робиться ряд тестів на наявність.

Це також полегшує використання всього файлу відразу на новій машині, не маючи проблем, які впливають на відкриття нового вікна терміналу.


Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier

так? занадто корисно для вас?
Майкл Дюрант

2
Дякую ТАК велике за спільний доступ. Тут багато інформації.
Вік

7

Це bashконфігураційний файл.

Інтерактивні оболонки (без входу в систему), тоді конфігура зчитується з цих файлів:

  • $HOME/.bashrc

Для оболонок входу конфігурація зчитується з цих файлів:

  • /etc/profile (Завжди постачається)
  • $HOME/.bash_profile (решта цих файлів перевіряються до того часу, поки один не знайдеться, тоді інші інші не читаються)
  • $HOME/.bash_login
  • $HOME/.profile

Проста ілюстрація того, як / коли вони завантажуються, наведена на зображенні нижче.

Я додав echoсвій .bashrcі.bash_profile

Інтерактивна оболонка проти оболонки для входу

див. man bashдля отримання додаткової інформації


2
Це насправді не додає додаткової цінності старому питанню. Також я бачу, що ви новачок у Unix & Linux, намагайтеся не публікувати зображення тексту, замість цього краще скористатися форматуванням блоку коду та скопіювати з консолі. Це дозволяє шукати / копіювати текст / тощо. У випадку вашого прикладу насправді немає складних команд чи нічого, що було б добре шукати, але є хороша практика для інших відповідей.
Centimane

1
Я не впевнений, що я повністю розумію вашу посилання на "старе запитання". Він знаходиться у верхньому списку запитань, і він доречний з 60-ти переглядом. Я вважав, що додана вартість виходить із формату, на відміну від діалогу / гіпотези, як попередні відповіді. але формат також редагували. Я буду пам’ятати ваші коментарі щодо використання кодових блоків, дякую.
Тімоті Л. Дж. Стюарт

2
Він знаходиться вгорі списку "активних" питань, оскільки ви опублікували відповідь. Питання було спочатку задано у 2014 році та прийняло відповідь. Прийнятий відповідь заявляє , мета .bashrcі відрізняє відмінність між .bashrcі .bash_profileяка охоплює зміст вашої відповіді. Не віддавайте духу, ви докладаєте чесних зусиль, але намагайтеся зосередитись на відповіді на запитання з певним вмістом, не охопленим іншими відповідями.
Centimane
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.