Antworten:
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/profile
wenn die Shell bash ist. Zum Beispiel habe /etc/profile
ich 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/profile
Bietet 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.bashrc
ist 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.
/etc/profile
in Ubuntu 12.04. Was würdest du stattdessen vorschlagen, wenn man eine will, /etc/profile
die nur unter Bash ausgeführt wird, und keine andere sh-kompatible Shell?
/etc/profile
Datei für mein System enthält einen Kommentar an der Spitze, der lautet: # System-wide .profile for sh(1)
. Bedeutet das, dass profile
es sh
spezifisch ist? Läuft das sh
irgendwie schon mal bash
?
sh
ist eine Teilmenge von bash
. /etc/profile
wird für sh
, bash
und alle anderen Bourne-kompatiblen Shells ausgeführt.
/etc/bashrc
auf dem Mac aufgerufen wird , nicht /etc/bash.bashrc
. Es scheint auch zu laufen /bin/sh
.
/etc/profile
ist 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.
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.
/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
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/profile
während /etc/profile.d/*.sh
Dateien geladen werden.
/etc/bash.bashrc
aus einer nicht interaktiven Shell./etc/profile
kann von einer nicht interaktiven Shell gelesen werden. Siehe Unterschied zwischen Anmeldeshell und Nicht-Anmeldeshell?