Jaki jest cel .bashrc i jak działa?

Odpowiedzi:

131

.bashrcto skrypt powłoki, który Bash uruchamia za każdym razem, gdy jest uruchamiany interaktywnie. Inicjuje interaktywną sesję powłoki. W tym pliku możesz umieścić dowolne polecenie, które można wpisać w wierszu polecenia.

Tutaj umieszczasz polecenia, aby skonfigurować powłokę do użycia w określonym środowisku lub dostosować rzeczy do swoich preferencji. Wspólną rzeczą do umieszczenia .bashrcaliasy , które chcesz zawsze być dostępne.

.bashrcdziała przy każdym uruchomieniu interaktywnej powłoki. Jeśli powiesz:

$ bash ; bash ; bash

a następnie Ctrl-Dtrzykrotnie uderzy , .bashrcuruchomi się trzy razy. Ale jeśli powiesz to:

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

wtedy w .bashrcogóle nie będzie działać, ponieważ -cpowoduje, że wywołanie Bash jest nieinteraktywne. To samo dotyczy uruchomienia skryptu powłoki z pliku.

Kontrast .bash_profilei .profilektóre są uruchamiane tylko na początku nowej powłoki logowania. ( bash -l) Ty decydujesz, czy polecenie wchodzi w .bashrctryb vs, w .bash_profilezależności od tego, czy chcesz, aby było uruchamiane raz czy przy każdym uruchomieniu interaktywnej powłoki.

W ramach kontrprzykładu do aliasów, które wolę wstawiać .bashrc, zamiast tego chcesz wprowadzić PATHzmiany .bash_profile, ponieważ zmiany te zwykle nie są idempotentne :

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

Jeśli wstawisz to .bashrczamiast tego, za każdym razem, gdy uruchomisz interaktywną podpowłokę, :/some/additionzostaniesz przywiązany do końca PATHdrugiej, tworząc dodatkową pracę dla powłoki, gdy pomylisz polecenie.

Pojawi się nowy interaktywny powłoki Bash, kiedy tylko bulić odvi z :sh, na przykład.

Warren Young
źródło
6
Drobne spory: w przeciwieństwie do większości innych powłok, bash nie ładuje automatycznie pliku konfiguracyjnego dla każdej instancji, .bashrcgdy jest uruchamiany jako powłoka logowania. Może to czasem prowadzić do nieoczekiwanego zachowania . Zwykłym obejściem jest źródło .bashrcz .profilelub .bash_profilezamiast.
Ilmari Karonen
@IlmariKaronen Ponieważ .bashrcnie jest przeznaczony do użytku przez inne powłoki, lepiej nie jest źródłem .profile( z którego mogą korzystać inne bashpowłoki).
chepner
@IlmariKaronen Co dzieje (czytaj: w jaki sposób można debugować dlaczego) podczas source ~/.bashrclub . ~/.bashrclub [[ -f ~/.bashrc ]] && source. ~/.bashrclub [ -f ~/.bashrc ] && source ~/.bashrcnie działa?
Nikos Alexandris
@NikosAlexandris: To osobne pytanie. Proszę pytać osobno .
Warren Young,
@WarrenYoung Zrobiłbym to, ale zdałem sobie sprawę, że .bashrctak naprawdę jest to źródło (za pomocą zalecanego polecenia superuser.com/a/183980/128768 ). Problem twarz jest właściwie nie pozyskiwanie https://github.com/junegunn/fzfza pośrednictwem tej komendy wewnątrz .bashrc: source ~/.fzf.bash. Odpalam nowy terminal, a potem Ctrl+ Ri dostaję `__fzf_history__`bash: fzf: command not found. Źródło ręcznie .bashrci ten sam skrót klawiszowy uruchamia FZF zgodnie z oczekiwaniami. Przepraszamy za hałas tutaj.
Nikos Alexandris
20

Celem .bashrcpliku jest zapewnienie miejsca, w którym można skonfigurować zmienne, funkcje i aliasy, zdefiniować monit (PS1) i zdefiniować inne ustawienia, których chcesz używać za każdym razem, gdy otwierasz nowe okno terminala.

Działa, uruchamiając się za każdym razem, gdy otwierasz nowy terminal, okno lub panel.

Możesz zobaczyć mój tutaj (zdjęcie z podświetlaniem składni) :

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"

Wyjaśnienie:

-1. Skonfiguruj mój plik historii, aby ignorował duplikaty i był znacznie większy niż domyślny.
-2. Opcja koloru w lszależności od tego, czy korzystasz z systemu Linux, czy OSX
-3. Funkcja „ md”, aby utworzyć i cd do katalogu za pomocą jednego polecenia
-4. Znajdź bieżącą gałąź git, jeśli znajdujesz się w repozytorium git i ...
-5. -9. Zdefiniuj niesamowite podpowiedź PS1, jak w <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </code>
-10. Ulepszony monit PS2
-11. Ustaw vi jako edytor w wierszu poleceń
-12. Ustaw vi jako domyślny edytor
-13. uruchom mój .bash_aliasesplik, jeśli istnieje
-14. Uruchom mój skrypt ukończenia karty git (dla pilotów i gałęzi), jeśli istnieje.
-15. Wykonaj autojump, jeśli istnieje
-16. Zezwalaj na cd'ing bez wpisywania części cd, jeśli wersja bash> = 4
-17. Wykonaj skrypt zakończenia bash, jeśli istnieje
-18. Użyj TMUX, jeśli jest obecny
-19. Dodaj rvm do mojej ŚCIEŻKI
-20. Użyj rvm, jeśli istnieje.

Zrobiłem to przenośne, aby działało na dowolnym moim komputerze z systemem Linux lub OSX bez dostosowywania - dlatego przed użyciem niektórych funkcji i innych skryptów wykonuje się szereg testów obecności.

Ułatwia to także natychmiastowe użycie całego pliku na nowym komputerze bez problemów, które wpływają na otwarcie nowego okna terminala.

Michael Durrant
źródło
Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier
co? zbyt pomocny dla ciebie?
Michael Durrant
2
Bardzo dziękuję za udostępnienie. Bogactwo informacji tutaj.
Vic
7

Jest to bashplik konfiguracyjny.

Interaktywne (niezalogowane) powłoki, następnie konfiguracja jest odczytywana z tych plików:

  • $HOME/.bashrc

W przypadku powłok logowania konfiguracja jest odczytywana z tych plików:

  • /etc/profile (Zawsze pozyskiwane)
  • $HOME/.bash_profile (reszta tych plików jest sprawdzana po kolei, dopóki nie zostanie znaleziony, a następnie nie zostaną odczytane żadne inne)
  • $HOME/.bash_login
  • $HOME/.profile

Prosta ilustracja tego, jak / kiedy są ładowane, znajduje się na poniższym obrazku.

Dodałem echodo mojego .bashrci.bash_profile

Powłoka interaktywna a powłoka logowania

zobacz man bashpo więcej informacji

Timothy LJ Stewart
źródło
2
To tak naprawdę nie dodaje dodatkowej wartości staremu pytaniu. Widzę też, że jesteś nowy w Uniksie i Linuksie, staraj się nie publikować zdjęć tekstu, zamiast tego lepiej jest użyć formatowania bloku kodu i skopiować go z konsoli. Umożliwia to wyszukiwanie / kopiowanie tekstu itp. W twoim przykładzie nie ma tak naprawdę żadnych skomplikowanych poleceń ani niczego, co byłoby dobre do przeszukania, ale dobra praktyka dla innych odpowiedzi.
Centimane
1
Nie jestem pewien, czy w pełni rozumiem twoje odniesienie do „starego pytania”. Znajduje się ono na górnej liście pytań i ma związek z 60 000 wyświetleń. Myślałem, że wartość dodana pochodzi z tego formatu, a nie z okna dialogowego / przypuszczenia, jak w poprzednich odpowiedziach. ale format również został edytowany. Będę pamiętać o twoich komentarzach na temat używania bloków kodu, dzięki.
Timothy LJ Stewart
2
Znajduje się na górze „aktywnej” listy pytań, ponieważ wysłałeś odpowiedź. Pytanie zostało pierwotnie zadane w 2014 r. I przyjęło odpowiedź. Zaakceptowana odpowiedź określa cel .bashrci rozróżnia różnicę między treścią odpowiedzi .bashrca tym, .bash_profileco obejmuje. Nie zniechęcaj się, podejmujesz uczciwy wysiłek, ale staraj się koncentrować na odpowiadaniu na pytania z treściami nieobjętymi innymi odpowiedziami.
Centimane