
Ich habe gerade zsh auf meinem Ubuntu-System installiert. Es scheint, dass zsh ~/.profile beim Init nicht ausführt. Nach meinem besten Verständnis sollte dies ein automatisches Verhalten sein. Was übersehe ich?
Antwort1
.profile
Vergleiche.zprofile
Zsh wird ausgeführt ~/.zprofile
, nicht ~/.profile
, wenn es als Login-Shell aufgerufen wird. Der Grund dafür ist, dass zsh genügend Inkompatibilitäten mit Standard-Shells aufweist, um Skripte zu beschädigen.
Zsh läuft , wenn es als oder ~/.profile
aufgerufen wird . Wenn Ihr Ziel jedoch darin besteht, beim Anmelden eine Zsh-Eingabeaufforderung zu erhalten, ist das keine Hilfe.sh
ksh
/bin/sh
Sie können Ihre Login-Shell erstellen und export SHELL=/bin/zsh
in Ihre einbinden ~/.profile
. Wenn Sie dann ein Terminal öffnen, startet das Terminal zsh (außer bei einigen Terminalemulatoren, die die $SHELL
Einstellung nicht befolgen). Sie haben aber immer noch , sh
wenn Sie sich über SSH anmelden. Dies kann durch Einbinden exec zsh
am Ende von behoben werden ~/.profile
(dadurch wird die laufende Shell durch zsh ersetzt), aber Sie müssen darauf achten, dass Sie dies nur bei interaktiven Anmeldungen tun und nicht, wenn ~/.profile
von anderen Skripten wie dem Start der X-Sitzung eingebunden wird (ein guter Test ist der Name des übergeordneten Prozesses, der von erhalten wurde ps -o comm= $PPID
: Wenn es sshd
oder ist su
, ist es sicher, exec
).
Die einfachste Lösung, sowohl mit zsh zu arbeiten als auch es auszuführen, ~/.profile
besteht darin, ein zu erstellen, ~/.zprofile
das während der Ausführung in den Sh-Emulationsmodus wechselt ~/.profile
:
emulate sh
. ~/.profile
emulate zsh
Wenn Sie über ein ausreichend aktuelles zsh verfügen (unter Ubuntu, also seit Lucid, glaube ich), können Sie dies vereinfachen zu emulate sh -c '. ~/.profile'
.
.zprofile
Vergleiche.zshrc
Die Datei ~/.profile
wird geladen vonAnmeldungShells. Die Login-Shell ist der erste Prozess, der gestartet wird, wenn Sie sich im Textmodus anmelden, beispielsweise auf einer Textkonsole oder über SSH. Auf den meisten Linux-Rechnern ist die Login-Shell standardmäßig Bash, Sie können sie jedoch mit dem chsh
Befehl oder über ein anderes Tool wie die „Benutzereinstellungen“ in Ubuntu ändern. Wenn es sich um eine Login-Shell handelt, liest Bash, ~/.bash_profile
wenn sie existiert und ~/.profile
, während Zsh nur liest ~/.zprofile
(weil seine Syntax nicht vollständig mit einer traditionellen SH kompatibel ist). Unter den meisten Konfigurationen ~/.profile
wird auch von den Startskripten der X-Sitzung geladen, wenn Sie sich in einem grafischen Anzeigemanager anmelden.
Wenn Sie einen Terminalemulator starten und eine Shell-Eingabeaufforderung erhalten oder wenn Sie eine Shell explizit starten, erhalten Sie eine Shell, die keine Login-Shell ist. Da ~/.profile
(oder ~/.zprofile
) für Befehle steht, die Sie beim Anmelden ausführen möchten, liest eine Nicht-Login-Shell diese Datei nicht. Wenn Sie stattdessen eine interaktive zsh starten, liest sie ~/.zshrc
. (Zsh liest ~/.zshrc
in allen interaktiven Shells, egal ob es sich um Login-Shells handelt oder nicht; bash liest seltsamerweise nie ~/.bashrc
in Login-Shells.)
Enthält normalerweise ~/.profile
Definitionen von Umgebungsvariablen und startet möglicherweise einige Programme, die Sie einmal beim Anmelden oder während der gesamten Sitzung ausführen möchten. ~/.zshrc
Enthält Dinge, die für jede Shell-Instanz erledigt werden müssen, z. B. Alias- und Funktionsdefinitionen, Shell-Optionseinstellungen, Vervollständigungseinstellungen, Eingabeaufforderungseinstellungen, Tastenkombinationen usw.
Antwort2
Kurze Antwort für Ungeduldige:
~/.profile
wird beimzsh
Login nicht geladen.zsh
wird beim Login geladen~/.zprofile
.zsh
~/.zshrc
wird beim Starten einer neuen Terminalsitzung geladen .
Benötigen Sie weitere Informationen? Sehen Sie sich Gilles‘ hervorragende Antwort an!
Antwort3
Zusätzlich zu Gilles‘ Antwort können Sie mit einer einigermaßen aktuellen Version von zsh Folgendes tun:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
...Dadurch wird die .profile-Datei mit dem wirksamen sh-Modus von zsh als Quelle verwendet. Und dieser ist nur während der Quelle aktiv. Sie müssen also den aktuellen Optionsstatus nicht speichern, um ihn nach der Quelle erneut abzuspielen.
Antwort4
DerzshDokumentation, die ich zur Hand habe, erwähnt nur /etc/profile
und ~/.profile
für Login-Shells inSch/kshKompatibilitätsmodus.
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
Die Login-Shell im nativen Modus (argv[0] beginnt mit -
) verwendet nicht ~/.profile
(verwendet ~/.zprofile
jedoch):
% zsh -c 'exec -a -zsh zsh' </dev/null
(keine Leistung)
Sch/kshLogin-Shells im Kompatibilitätsmodus verwenden .profile:
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...