it-swarm.com.de

Grundlegendes zu .bashrc und .bash_profile

Wenn ich mich auf einem Server als root anmelde, sehe ich .bashrc (Ubuntu 10.10).

Auf meinem Mac habe ich einen .bash_profile

Hat Ubuntu immer nur eine .bashrc -Datei 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 ​​in .bashrc einfügen?

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

24
Blankman

Bash-Aliase sollte in die .bash_aliases- oder .bashrc -Dateien in den einzelnen Basisverzeichnissen eingefügt werden. Wenn Sie globale Bash-Aliase erstellen müssen, können sie in /etc/bash.bashrc eingegeben werden. Oft ist es jedoch am besten, sie einfach zu den .bash_aliases- oder .bashrc -Dateien in /etc/skel hinzuzufügen von neu erstellten Benutzern geerbt.

Es ist praktisch immer falsch , einen Alias ​​in .profile, .bash_profile oder /etc/profile zu definieren.

Um zu verstehen, warum, muss man verstehen, unter welchen Umständen Befehle von 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 GUI verwenden, sind die meisten Ihrer interaktiven Shells wahrscheinlich non-login Shells. Auch wenn Sie nie eine GUI verwenden, verwenden Sie wahrscheinlich immer noch non-login 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, gibt sie .bashrc im Basisverzeichnis des Benutzers aus. In Ubuntu gibt jeder Benutzer .bashrc standardmäßig selbst .bash_aliases aus, sofern vorhanden.

  • Um source einen Inhalt einer Datei in der current Shell auszuführen. Ä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 .bashrc zeigt, dass es offiziell beabsichtigt ist, dass Aliase in .bashrc oder .bash_aliases eingegeben werden. .bashrc enthält bereits einige Alias-Definitionen (führen Sie grep '^[[:blank:]]*alias' ~/.bashrc aus, um sie anzuzeigen) und gibt explizite Hinweise, wo neue 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 wie sieht es mit interaktiven login Shells aus? Anstelle von .bashrc schält login source .profile.

  • ... Wenn .bash_login nicht existiert, wird stattdessen ein Sourcing durchgeführt.
  • ... Wenn .bash_profile nicht existiert, wird stattdessen it bezogen.

Die gute Nachricht ist jedoch, dass standardmäßig in Ubuntu Befehle in .bashrc auch in interaktiven Login-Shells ausgeführt werden, weil die Standardeinstellung .profile prüft, ob die aktuelle Shell bash ist (und ob .bashrc existiert), und gibt in diesem Fall .bashrc aus:

# 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 neue Bash-Aliase in .bash_aliases in ihren Home-Verzeichnissen definieren (erstellen, wenn es noch nicht existiert). Dies ist eine besonders saubere und einfache Methode, um Aliasdefinitionen auf Benutzerebene permanent zu machen.

Aliase sollten nicht in .profile definiert werden, da sie in nicht angemeldeten Shells undefiniert bleiben würden. Anders als in den meisten Umgebungen einer Bash-Shell werden Aliase nicht in untergeordnete Shells exportiert:

[email protected]:~$ alias hi='echo "Greetings, $USER!"'
[email protected]:~$ hi
Greetings, ek!
[email protected]:~$ bash
[email protected]:~$ hi
hi: command not found

Insbesondere führen die meisten Desktop-Umgebungen standardmäßig dazu, dass .profile bei der grafischen Anmeldung bezogen wird, aber:

  1. Dies wird nicht notwendigerweise von einer Bash-Shell ausgeführt, sodass Alias-Definitionen möglicherweise nicht verarbeitet werden. und vor allem
  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 demselben Grund, sondern auch aus einem anderen Grund in .bash_profile (oder .bash_login) definiert werden. Das einfache Erstellen einer dieser Dateien und das Einfügen von just Aliasdefinitionen verhindert, dass der Code in .profile ausgeführt wird!

In Situationen, in denen .bash_profile oder .bash_login wirklich nützlich ist, wird normalerweise irgendwo in ihnen .profile angegeben, wodurch das Problem behoben wird. (Das einzige verbleibende Problem ist, dass das Definieren von Aliasen in .profile oder .bash_profile wie bei .bash_login nicht richtig funktioniert.)

Aliase für New einzelne 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/skel wird dann in ihr Ausgangsverzeichnis kopiert. Auf diese Weise beginnen mehrere Benutzer mit ähnlichen Konfigurationsdateien in ihren Basisverzeichnissen. In Ubuntu sind dies .profile, .bashrc und einige andere Dateien.

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

Wenn Sie eine bereits vorhandene Datei in /etc/skel bearbeiten, möchten Sie sie möglicherweise zuerst sichern - aber Sie sollten die Sicherung nicht in /etc/skel ablegen, da sie sonst ebenfalls in neue Benutzer kopiert wird 'Home-Verzeichnisse.

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 /etc/skel/.bash_aliases definieren, können Sie sie einfach an diese Datei weiterleiten, die sie in ihre Ausgangsverzeichnisse kopieren (oder in ihre eigene benutzerdefinierte .bash_aliases -Datei einfügen).

Es ist für einen Benutzer trivial, einen Alias ​​zu definieren. Zusätzlich Aliase sind nicht extrem robust ; Sie funktionieren nur unter bestimmten Umständen. Wenn Sie einen neuen Befehl erstellen müssen, der immer funktioniert , für alle , sollten Sie diesen Befehl nicht als Alias ​​implementieren. Und Sie können Benutzern, die sie nicht wollen, keine Aliase aufzwingen - sie können sie einfach unalias.

Globale Aliase für alle Benutzer

Obwohl ich Ihnen rate, diesen Ansatz zu vermeiden, können Sie Aliase in der Datei global /etc/bash.bashrc definieren. Sie werden dann sowohl für interaktive Shells ohne Anmeldung als auch für interaktive Anmeldeshells definiert. Der Grund dafür ist, dass vor alle Dateien im Ausgangsverzeichnis des Benutzers stammen:

  • Anmeldeshells (und nur Anmeldeshells und andere Prozesse, die sich wie Anmeldeshells verhalten) führen Befehle von /etc/profile automatisch aus.
  • Nur nicht angemeldete Shells führen Befehle in /etc/bash.bashrc automatisch aus, aber
  • Ubuntus voreingestellter /etc/profile überprüft, ob die laufende Shell bash ist (und ob /etc/bash.bashrc existiert) und gibt, falls ja, /etc/bash.bashrc als Quelle an.

Dies ist analog zu der Vorgehensweise, mit der der Standard-Benutzer .profile den Benutzer .bashrc bezieht, wenn die Shell bash ist (wie oben beschrieben).

So sieht der eigentliche Code dafür in der Standardeinstellung /etc/profile aus:

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 prüft die äußere if, ob es wahrscheinlich ist, dass die Shell interaktiv ist (indem überprüft wird, dass der Aufforderungstext nicht leer ist), und prüft dann, ob die aktuelle Shell bash ist und gibt /etc/bash.bashrc aus, falls dies der Fall ist. und wenn nicht, funktioniert etwas, was für bash bereits in /etc/bash.bashrc erledigt ist.

Sie sollten nicht globale Aliase in /etc/profile definieren, aus demselben Grund sollten Benutzer sie nicht in ihren lokalen .profiles definieren: Wenn Sie dies tun, werden sie definiert Nur für Login-Shells und nicht für ihre Kinder-Shells.

Beachten Sie schließlich, dass die Standarddatei .bashrc im Gegensatz zur Standarddatei /etc/bash.bashrc keine Informationen zu Aliasnamen enthält. Es ist etwas ungewöhnlich, Benutzern Aliase in einer Datei zu geben, in der sie sie nicht bearbeiten oder deaktivieren können. (Natürlich können sie dies immer noch tun, indem sie ihre Definitionen in ihrem eigenen lokalen .bashrc, .bash_aliases oder anderswo überschreiben.)

Weiterführende Literatur

38
Eliah Kagan

Hier ist ein Nizza Lesen drauf. ".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

5
geermc4