Grundlegendes zu .bashrc und .bash_profile

26

Auf einem Server, wenn ich mich als root anmelde, sehe ich .bashrc(Ubuntu 10.10).

Auf meinem Mac habe ich eine .bash_profile

Hat Ubuntu immer nur eine .bashrcDatei und nicht .bash_profile? (Ich bin nur verwirrt, also frage ich, ich merke, dass sie verschiedene O / s sind, aber vielleicht gibt es irgendwie eine Beziehung?)

Soll ich auf meinem Server einen Alias ​​erstellen .bashrc?

Was ist, wenn ich möchte, dass dieser Alias ​​angewendet wird, damit alle Benutzer ihn verwenden können?

Blankman
quelle
1
Möglicherweise ein Duplikat von: askubuntu.com/questions/1528/bashrc-or-bash-profile - Ich empfehle Ihnen, Ihre Frage dahingehend zu ändern, dass Sie nur fragen, wo Aliase global abgelegt werden sollen.

Antworten:

39

Bash-Aliase sollten in den .bash_aliasesoder .bashrc-Dateien in den einzelnen Basisverzeichnissen abgelegt werden. Wenn Sie globale Bash-Aliase erstellen müssen, können diese eingehen. /etc/bash.bashrcOft ist es jedoch am besten, sie einfach zu den .bash_aliasesoder .bashrc-Dateien hinzuzufügen, /etc/skeldamit sie von neu erstellten Benutzern geerbt werden.

Es ist fast immer falsch ein Alias in in zu definieren .profile, .bash_profileoder /etc/profile.

Um zu verstehen, warum, muss man verstehen, unter welchen Umständen Befehle aus jeder dieser Dateien ausgeführt werden. Es gibt Missverständnisse darüber, die ich unten anspreche.

Auch wenn Sie Aliase für mehrere Benutzer definieren möchten, sollten Sie mit deren Definition für einzelne Benutzer vertraut sein, damit Sie entscheiden können, welche Methode am besten für Sie geeignet ist.

Aliase für einzelne Benutzer

Insbesondere wenn Sie eine grafische Benutzeroberfläche verwenden , handelt es sich bei den meisten interaktiven Shells wahrscheinlich um nicht angemeldete Shells. Auch wenn Sie nie eine GUI verwenden, verwenden Sie wahrscheinlich immer noch nicht angemeldete Shells mit einer gewissen Häufigkeit. Sie möchten, dass Ihre Aliase in diesen Shells funktionieren.

Insbesondere wenn Sie sich jemals nicht grafisch in einer virtuellen Konsole oder über SSH anmelden, verwenden Sie wahrscheinlich manchmal Anmelde-Shells. Sie möchten also, dass Ihre Aliase auch in interaktiven Login-Shells funktionieren.

Wenn eine interaktive Shell ohne Anmeldung gestartet wird , wird sie im Basisverzeichnis .bashrcdes Benutzers gespeichert. Standardmäßig bezieht jeder Benutzer in Ubuntu .bashrcselbst Quellen .bash_aliases, falls vorhanden.

  • Um Quelle ist eine Datei , sein Inhalt zu veranlassen, in der ausgeführt wird aktuell Shell. Änderungen an der Shell-Umgebung, die in einer Datei vorgenommen wurden, die als Quelle dient, bleiben auch nach Ausführung aller Befehle in der Datei bestehen.

Das Lesen der Kommentare in Ubuntus Standard .bashrczeigt, dass es offiziell beabsichtigt ist, dass Aliase in .bashrcoder gehen .bash_aliases. .bashrcEnthält bereits einige Alias-Definitionen (führen Sie sie aus grep '^[[:blank:]]*alias' ~/.bashrc, um sie anzuzeigen) und gibt explizite Hinweise dazu, wo solche Definitionen eingefügt werden sollen:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Aber was ist mit interaktiven Login- Shells? Anstelle von " .bashrclogin shells source" .profile.

  • ... Sofern nicht .bash_loginvorhanden, wird es stattdessen beschafft.
  • ... Sofern nicht .bash_profilevorhanden, wird es stattdessen beschafft.

Allerdings ist die gute Nachricht , dass in Ubuntu standardmäßig Befehle in .bashrcwerden auch in der interaktiven Login - Shells laufen , weil der Standard.profileStandardprüft , ob der aktuell Shell bash (und wenn ist .bashrcvorhanden), und wenn ja, Quellen .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Ich schlage vor, dass Benutzer .bash_aliasesin ihren Home-Verzeichnissen neue Bash-Aliase definieren (die erstellt werden, wenn sie noch nicht vorhanden sind). Dies ist eine besonders saubere und einfache Methode, um Aliasdefinitionen auf Benutzerebene permanent zu machen.

Aliase sollten nicht definiert werden,.profile da sie in nicht angemeldeten Shells undefiniert bleiben würden. Im Gegensatz zu einem Großteil der Umgebung einer Bash-Shell sind Aliase dies nicht in untergeordnete Shells exportiert:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

Insbesondere verursachen standardmäßig die meisten Desktop-Umgebungen .profile bei der grafischen Anmeldung bereitgestellt, aber:

  1. Dies wird nicht unbedingt von einer Bash-Shell ausgeführt, sodass Alias-Definitionen möglicherweise nicht einmal verarbeitet werden. noch wichtiger ist
  2. Auch wenn Aliasdefinitionen verarbeitet werden, werden sie nicht an untergeordnete Prozesse weitergegeben . Insbesondere werden sie nicht an Shells weitergegeben, die durch Öffnen eines Terminal-Fensters erstellt wurden!

Aliase sollten nicht aus.bash_profile.bash_login demselben Grund, sondern auch aus einem anderen Grund in (oder ) definiert werden . Naives Erstellen einer dieser Dateien und Putten nur Alias - Definitionen in es in einem der Code verhindert die .profileAusführung von!

In Situationen, in denen .bash_profileoder .bash_loginwirklich nützlich ist, gibt es normalerweise .profileirgendwo eine Quelle , die dieses Problem löst. (Dann ist das einzige verbleibende Problem, wie bei.profile Definieren von Aliasen wie bei .bash_profileoder .bash_loginnicht richtig funktioniert.)

Aliase für neue Benutzer, automatisch

Wenn ein Benutzerkonto des Typs erstellt wird, der einen echten Menschen darstellen soll, wird in der Regel ein neues Verzeichnis erstellt, das als Basisverzeichnis dient. Der Inhalt von /etc/skelwird dann in das Ausgangsverzeichnis kopiert. Auf diese Weise beginnen mehrere Benutzer mit ähnlichen Konfigurationsdateien in ihren Basisverzeichnissen. In Ubuntu schließt dies ein.profile , .bashrcund einige andere Dateien.

Um zu ändern, welche Aliase für neue Benutzer definiert sind, können Sie diese einfach eingeben /etc/skel/.bash_aliases (Sie müssen sie erstellen) oder /etc/skel/.bashrc.

Wenn Sie eine bereits vorhandene Datei in bearbeiten /etc/skel möchten Sie diese möglicherweise zuerst sichern. Sie sollten die Sicherungskopie jedoch nicht ablegen /etc/skel, da sie sonst ebenfalls in die Home-Verzeichnisse der neuen Benutzer kopiert wird.

Dies ist wahrscheinlich die beste Möglichkeit, um neue Aliase für mehrere Benutzer hinzuzufügen. Bestehende Benutzer können die Aliase einfach selbst hinzufügen. Wenn Sie die Aliase in definieren/etc/skel/.bash_aliases , können Sie sie einfach an diese Datei weiterleiten, die sie möglicherweise in ihre Ausgangsverzeichnisse kopieren (oder in ihre eigene benutzerdefinierte .bash_aliasesDatei einfügen).

Es ist für einen Benutzer trivial, einen Alias ​​zu definieren. Darüber hinaus sind Aliase nicht extrem robust . Sie funktionieren nur unter bestimmten Umständen. Wenn Sie einen neuen Befehl erstellen müssen, der die ganze Zeit funktioniert , für alle , sollten Sie nicht den Befehl als Alias implementieren. Und Sie können Benutzern, die sie nicht möchten, keine Aliase aufzwingen - sie können sie einfach unalias.

Globale Aliase für alle Benutzer

Obwohl ich Ihnen raten , diesen Ansatz zu vermeiden, Sie können Aliase in der die definieren globale /etc/bash.bashrc Datei. Sie werden dann sowohl für interaktive Shells ohne Anmeldung als auch für interaktive Anmeldeshells definiert. Der Grund ist, vor Dateien im Home-Verzeichnis des Benutzers bezogen werden:

  • Anmeldeshells (und nur Anmeldeshells und andere Prozesse, die sich wie Anmeldeshells verhalten) führen Befehle aus /etc/profile automatisch aus.
  • Nur Nicht-Login - Shells Ausführen von Befehlen in /etc/bash.bashrcautomatisch, aber
  • Ubuntus Standard /etc/profileprüft, ob es sich bei der laufenden Shell um Bash handelt (und falls /etc/bash.bashrcvorhanden) und wenn ja, um Sources /etc/bash.bashrc.

Dies ist analog dazu, wie die Standardeinstellung pro Benutzer .profileden pro Benutzer ausgibt, .bashrcwenn die Shell bash ist (wie oben beschrieben).

So sieht der eigentliche Code dafür im Standard aus /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Dieser Block führt auch andere Aufgaben aus. Insbesondere ifprüft der Outer , ob die Shell wahrscheinlich interaktiv ist (indem er prüft, ob der Aufforderungstext nicht leer ist), und prüft dann, ob die aktuelle Shell eine Bash ist und gibt Quellen an /etc/bash.bashrc, wenn dies nicht der Fall ist ist schon fertig in/etc/bash.bashrc .

Sie sollten nicht globale Aliase in definieren /etc/profilefür die gleichen Grund sollten Benutzer sie nicht in ihrem lokalen definieren.profile s: wenn Sie das tun, werden sie nur für Login - Shells, und nicht für ihr Kind Schalen definiert werden.

Schließlich ist zu beachten , dass im Gegensatz zu der Standard - pro-Benutzer .bashrc, der Standard /etc/bash.bashrchat Datei nichts über Aliase enthalten. Es ist etwas ungewöhnlich, Benutzern Aliase in einer Datei zu geben, in der sie sie nicht bearbeiten oder deaktivieren können. (Natürlich, sie noch kann das tun, durch zwingende ihre Definitionen in ihrem eigenen lokalen .bashrc, .bash_aliasesoder anderswo.)

Weitere Lektüre

Eliah Kagan
quelle
5

Hier ist eine nette Lektüre darüber. ".bash_profile wird für Login-Shells ausgeführt, während .bashrc für interaktive Shells ohne Login ausgeführt wird"

Verwenden Sie für Ihren Alias ​​.bash_profile

geermc4
quelle
4
Das Einfügen von Aliasen .bash_profileist nicht korrekt. In Ubuntu .profile(das für Login-Shells ausgeführt wird) wird .bashrcals Quelle eine interaktive Bash-Shell verwendet. Das Einfügen von Aliasen in .bashrc(oder das Eingeben von .bash_aliasesQuellen .bashrc) definiert sie in allen interaktiven Bash-Shells. Aliase in .bash_profileergeben unter anderem dieses Problem . Siehe dies , das , meine Antwort und die ~/.bashrcKommentare der Standardeinstellung , die empfehlen, Aliase dort oder dort abzulegen .bash_aliases.
Eliah Kagan