Globales bash_profile

20

Ich weiß , es gibt /etc/profileund /etc/bashrcDateien für die globalen Umgebungsvariablen und vielleicht bin ich nur ihre Zwecke Missverständnis, aber ...

Gibt es eine globale bash_profileDatei?

Ich benutze Mac OS X

Hubro
quelle

Antworten:

15

Es wird nicht aufgerufen bash_profile, aber der Standardort für die globale Bash-Konfiguration ist /etc/bash.bashrc. Es ist üblich, dies so zu bezeichnen, /etc/profilewenn die Shell bash ist. Zum Beispiel habe /etc/profileich in meinem :

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1=’0
    if [ f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  fi
fi

/etc/profileBietet im Hinblick auf die Verwendung eine systemweite Konfiguration für alle Bourne-kompatiblen Shells (sh, bash, ksh usw.). Normalerweise ist keine Entsprechung erforderlich /etc/bash_profile, da die Profildatei das Verhalten für Anmeldeshells steuern soll. Normalerweise ist alles, was Sie dort tun möchten, nicht bash-spezifisch. /etc/bash.bashrcist bash-spezifisch und wird sowohl für Anmelde- als auch für Nicht-Anmelde-Shells ausgeführt.

Um die Sache noch weiter zu komplizieren, hat OS X anscheinend noch nicht einmal eine /etc/bash.bashrc. Dies hängt wahrscheinlich damit zusammen, dass Terminals in OS X standardmäßig als Anmeldeshells ausgeführt werden , sodass die Unterscheidung verloren geht:

Eine Ausnahme zu den Richtlinien für Terminalfenster ist die Terminal.app von Mac OS X, die standardmäßig für jedes neue Terminalfenster eine Anmelde-Shell ausführt, die .bash_profile anstelle von .bashrc aufruft. Andere GUI-Terminalemulatoren tun möglicherweise dasselbe, die meisten neigen jedoch dazu, dies nicht zu tun.

Ich führe kein OS X aus, daher endet der Umfang meines Wissens dort.

ire_and_curses
quelle
Lesen Sie nicht /etc/bash.bashrcaus einer nicht interaktiven Shell. /etc/profilekann von einer nicht interaktiven Shell gelesen werden. Siehe Unterschied zwischen Anmeldeshell und Nicht-Anmeldeshell?
Gilles 'SO- hör auf böse zu sein'
@ Gilles - Mir ist nicht klar, welchen Punkt Sie hier ansprechen wollen. Eine nicht interaktive Login-Shell ist in der Tat eine ungewöhnliche Sache. Der Code, den ich zitiere, ist nicht meine eigene Kreation. Es ist von der Standardeinstellung /etc/profilein Ubuntu 12.04. Was würdest du stattdessen vorschlagen, wenn man eine will, /etc/profiledie nur unter Bash ausgeführt wird, und keine andere sh-kompatible Shell?
ire_and_curses
Das System /etc/profileDatei für mein System enthält einen Kommentar an der Spitze, der lautet: # System-wide .profile for sh(1). Bedeutet das, dass profilees shspezifisch ist? Läuft das shirgendwie schon mal bash?
@ Josh Voigts - shist eine Teilmenge von bash. /etc/profilewird für sh, bashund alle anderen Bourne-kompatiblen Shells ausgeführt.
ire_and_curses
@ire_and_curses Es scheint, dass die Datei /etc/bashrcauf dem Mac aufgerufen wird , nicht /etc/bash.bashrc. Es scheint auch zu laufen /bin/sh.
BrainStorm.exe
4

/etc/profileist das globale bash_profile. Es gibt keine Datei, die spezifisch für bash ist. Bash liest nur die Standarddatei, die von allen Bourne-Shell-Elementen gelesen wird. Hier können Sie systemweite Umgebungsvariablen festlegen.

Siehe Gibt es eine ".bashrc" -Äquivalentdatei, die von allen Shells gelesen wird? für eine allgemeine Übersicht über die allgemeinen Startdateien von bash.

Gilles 'SO - hör auf böse zu sein'
quelle
0

Richten Sie Interactive Shell (Bash) global ein

Dies wird nicht geladen /etc/profile, so dass nichts in /etc/profile.d/geladen wird (im Gegensatz zu Login-Shells, siehe das Ende).

Die globale Datei dafür ist /etc/bashrc oder /etc/bash.bashrc (abhängig vom -DSYS_BASHRC=Flag, das beim Kompilieren gesetzt wurde):

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Normalerweise ist es eine gute Idee, diese Datei so zu belassen, wie sie ist (so weit wie möglich), um Konflikte zu vermeiden. Die Strategie, die ich verwende, ähnelt derjenigen, die Anmelde-Shells (/ etc / profile) verwenden.

Meine Strategie ist es, einen Loader an die obige Datei anzuhängen:

# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d

# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
  for script in /etc/bashrc.d/*.sh; do
    test -r "$script" && . "$script"
  done
  unset item
fi
EOF

Jetzt kann ich der globalen interaktiven Shell-Datei (Bash) auf einfache Weise n Anpassungen hinzufügen, indem ich neue .shfiles in das Verzeichnis /etc/bashrc.d lege.

Grep global einfärben

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Sie können dies mit diesem Einzeiler tun:

printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh

Vergleichen Sie profile.d mit bashrc.d

Wenn Sie nach dem Lesen nicht überzeugt sind, tun Sie dies, um sich selbst zu überzeugen:

printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh

Öffnen Sie einen neuen Terminal-Emulator und suchen Sie in Ihrem Benutzerverzeichnis nach einem gängigen Wort wie "the" mit grep

grep -r 'the'

Nichts sollte gefärbt sein. Machen Sie dasselbe in einer virtuellen Konsole, indem Sie CTRLALTF1 ausführen (denken Sie daran, dass Ihr X-Server wahrscheinlich mit CTRLALTF7 ausgeführt wird, damit Sie zurückwechseln können. Wenn Sie es vergessen haben, starten Sie zum Beispiel einfach Ihren Desktop-Manager neu.)

grep -r 'the' 

liefert nach Wunsch farbige Ergebnisse.

Nichts sollte gefärbt sein. Tun Sie dasselbe in einer virtuellen Konsole, indem Sie Folgendes tun CTRLALTF1(denken Sie daran, dass Ihr X-Server wahrscheinlich gerade ausgeführt wird, CTRLALTF7damit Sie zurückschalten können. Wenn Sie es vergessen haben, starten Sie zum Beispiel einfach Ihren Desktop-Manager neu).

grep -r 'the' 

liefert nach Wunsch farbige Ergebnisse.

Eine Login-Shell erhalten Sie, wenn Sie eine Maschine booten oder virtuelle Konsolen CTRLALTF1über die FNthvirtuelle Konsole wechseln .

Eine Login-Shell wird geladen, /etc/profilewährend /etc/profile.d/*.shDateien geladen werden.

Jonathan Komar
quelle