Was ist der Zweck von .bashrc und wie funktioniert es?

Antworten:

131

.bashrcist ein Shell-Skript , das Bash immer dann ausführt, wenn es interaktiv gestartet wird. Es initialisiert eine interaktive Shell-Sitzung. Sie können jeden Befehl in diese Datei einfügen, den Sie an der Eingabeaufforderung eingeben können.

Sie geben hier Befehle ein, um die Shell für die Verwendung in Ihrer speziellen Umgebung einzurichten oder die Dinge an Ihre Vorlieben anzupassen. Eine gemeinsame Sache bringen in .bashrcsind Aliase , die Sie immer zur Verfügung stehen sollen.

.bashrcLäuft bei jedem interaktiven Shell-Start. Wenn du sagst:

$ bash ; bash ; bash

und dann Ctrl-Ddreimal getroffen, .bashrcwird dreimal ausgeführt. Aber wenn Sie das stattdessen sagen:

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

wird dann .bashrcgar nicht ausgeführt, da -cder Bash-Aufruf nicht interaktiv wird. Dasselbe gilt, wenn Sie ein Shell-Skript aus einer Datei ausführen.

Contrast .bash_profileund .profiledie nur zu Beginn einer neuen Login-Shell ausgeführt werden. ( bash -l) Sie wählen, ob ein Befehl in .bashrcvs eingeht, .bash_profileje nachdem, ob er einmal oder bei jedem interaktiven Shell-Start ausgeführt werden soll.

Als Gegenbeispiel für Aliase, die ich lieber einsetze .bashrc, möchten Sie stattdessen PATHAnpassungen vornehmen .bash_profile, da diese Änderungen in der Regel nicht idempotent sind :

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

Wenn Sie dies .bashrcstattdessen einfügen , wird jedes Mal, wenn Sie eine interaktive Sub-Shell starten, :/some/additiondas Thema bis zum Ende des PATHnächsten Schritts fortgesetzt, wodurch zusätzliche Arbeit für die Shell entsteht, wenn Sie einen Befehl falsch eingeben.

Sie erhalten eine neue interaktive Bash-Shell, wenn Sie zum Beispiel mit einer Shell aussteigenvi:sh .

Warren Young
quelle
6
Kleinere Unstimmigkeiten: Im Gegensatz zu den meisten anderen Shells lädt bash die Konfigurationsdatei pro Instanz nicht automatisch, .bashrcwenn es als Anmeldeshell gestartet wird. Dies kann manchmal zu unerwartetem Verhalten führen . Die übliche Problemumgehung besteht darin, .bashrcvon .profileoder zu .bash_profilebeziehen.
Ilmari Karonen
@IlmariKaronen Da .bashrces nicht für die Verwendung durch andere Shells vorgesehen ist, ist es besser, es nicht von .profile(möglicherweise von anderen Nicht- bashShells) zu beziehen .
Chepner
@IlmariKaronen was passiert (lies: wie kann ich warum debuggen) wenn source ~/.bashrcoder . ~/.bashrcoder [[ -f ~/.bashrc ]] && source. ~/.bashrcoder oder [ -f ~/.bashrc ] && source ~/.bashrcnicht funktioniert?
Nikos Alexandris
@NikosAlexandris: Das ist eine separate Frage. Bitte separat anfragen .
Warren Young
@WarrenYoung Ich würde, aber mir wurde klar, dass dies .bashrctatsächlich aus Quellen stammt (mit dem empfohlenen Befehl von superuser.com/a/183980/128768 ). Das Problem , das ich konfrontiert ist eigentlich die nicht Beschaffung https://github.com/junegunn/fzfüber diesen Befehl innen .bashrc: source ~/.fzf.bash. Ich starte ein neues Terminal, dann Ctrl+ Rund ich bekomme `__fzf_history__`bash: fzf: command not found. Ich .bashrcbeschaffe manuell und die gleiche Tastenkombination startet FZF wie erwartet. Entschuldigung für den Lärm hier.
Nikos Alexandris
20

Der Zweck einer .bashrcDatei besteht darin, einen Ort bereitzustellen, an dem Sie Variablen, Funktionen und Aliase einrichten, Ihre PS1-Eingabeaufforderung definieren und andere Einstellungen definieren können, die Sie bei jedem Start verwenden möchten, wenn Sie ein neues Terminalfenster öffnen.

Es wird jedes Mal ausgeführt, wenn Sie ein neues Terminal, Fenster oder Fenster öffnen.

Sie können meine hier sehen (Bild mit Syntax-Hervorhebung) :

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"

Erläuterung:

-1. Richten Sie meine Verlaufsdatei so ein, dass Duplikate ignoriert werden und sie viel größer als die Standarddatei sind.
-2. Farboption für lsje nachdem, ob Sie Linux oder OSX-
3 verwenden. Funktion " md", um mit einem Befehl
-4 ein Verzeichnis zu erstellen und zu cden. Finde den aktuellen Git-Zweig in einem Git-Repo und ...
-5. -9. Definieren Sie eine großartige PS1-Eingabeaufforderung wie in <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </ code>
-10. Verbesserte PS2-Eingabeaufforderung
-11. Setze vi als Editor in der Kommandozeile
-12. Legen Sie vi als Standardeditor
-13 fest. Führe meine .bash_aliasesDatei aus, wenn sie existiert
-14. Führe mein Git-Tab-Vervollständigungsskript aus (für Fernbedienungen und Verzweigungen), falls es existiert.
-fünfzehn. Führen Sie den Autojump aus, falls vorhanden
-16. Erlaube cd'ing ohne Eingabe des CD-Teils, wenn die Bash-Version> = 4 ist
-17. Führen Sie ein Bash-Abschlussskript aus, falls vorhanden
-18. Verwenden Sie TMUX, wenn es vorhanden ist
-19. Füge rvm zu meinem PATH
-20 hinzu. Verwenden Sie rvm, falls vorhanden.

Ich habe dieses tragbare Gerät so gestaltet, dass es auf jedem meiner Linux- oder OSX-Computer ohne Anpassung funktioniert. Daher werden einige Tests auf Vorhandensein durchgeführt, bevor bestimmte Funktionen und andere Skripte verwendet werden.

Dies erleichtert auch die sofortige Verwendung der gesamten Datei auf einem neuen Computer, ohne dass Probleme auftreten, die sich auf das Öffnen eines neuen Terminalfensters auswirken.

Michael Durrant
quelle
Overkill ... ͏͏͏͏͏͏͏͏͏
Pacerier
huh? zu hilfreich für dich?
Michael Durrant
2
Vielen Dank für das Teilen. Eine Fülle von Informationen hier.
Vic
7

Es ist eine bashKonfigurationsdatei.

Interaktive (nicht angemeldete) Shells, dann wird die Konfiguration aus diesen Dateien gelesen:

  • $HOME/.bashrc

Für Login-Shells wird die Konfiguration aus den folgenden Dateien gelesen:

  • /etc/profile (Immer bezogen)
  • $HOME/.bash_profile (Der Rest dieser Dateien wird der Reihe nach geprüft, bis eine gefunden wurde, dann werden keine anderen gelesen.)
  • $HOME/.bash_login
  • $HOME/.profile

Die Abbildung unten zeigt, wie und wann sie geladen werden.

Ich habe ein echozu meinem .bashrcund hinzugefügt.bash_profile

Interaktive Shell vs Login-Shell

siehe man bashfür weitere Informationen

Timothy LJ Stewart
quelle
2
Dies erhöht den Wert einer alten Frage nicht wirklich. Ich sehe auch, dass Sie neu in Unix & Linux sind. Versuchen Sie, keine Textbilder zu veröffentlichen. Verwenden Sie stattdessen besser die Codeblockformatierung und kopieren Sie sie von Ihrer Konsole. Dadurch kann der Text durchsucht / kopiert / etc. Werden. Im Fall Ihres Beispiels gibt es keine wirklich komplizierten Befehle oder irgendetwas, was gut zu suchen wäre, sondern eine gute Praxis für andere Antworten.
Centimane
1
Ich bin mir nicht sicher, ob ich Ihren Verweis auf "alte Frage" vollständig verstehe. Er befindet sich in der oberen Fragenliste und ist mit 60.000 Ansichten relevant. Ich dachte, dass der Mehrwert vom Format herrührt, im Gegensatz zu einem Dialog / einer Vermutung wie den vorherigen Antworten. Das Format wurde jedoch ebenfalls bearbeitet. Ich werde mich an Ihre Kommentare zur Verwendung von Codeblöcken erinnern, danke.
Timothy LJ Stewart
2
Es steht ganz oben in der Liste der aktiven Fragen, weil Sie eine Antwort gepostet haben. Die Frage wurde ursprünglich im Jahr 2014 gestellt und akzeptiert eine Antwort. Die akzeptierte Antwort gibt den Zweck .bashrcund den Unterschied zwischen .bashrcund an, .bash_profileder den Inhalt Ihrer Antwort abdeckt. Lassen Sie sich nicht entmutigen, Sie geben sich ehrlich Mühe, aber versuchen Sie, sich auf die Beantwortung von Fragen mit Inhalten zu konzentrieren, die von anderen Antworten nicht abgedeckt werden.
Centimane