Zsh trifft nicht auf ~/.profile

Zsh trifft nicht auf ~/.profile

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

.profileVergleiche.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 ~/.profileaufgerufen wird . Wenn Ihr Ziel jedoch darin besteht, beim Anmelden eine Zsh-Eingabeaufforderung zu erhalten, ist das keine Hilfe.shksh

/bin/shSie können Ihre Login-Shell erstellen und export SHELL=/bin/zshin Ihre einbinden ~/.profile. Wenn Sie dann ein Terminal öffnen, startet das Terminal zsh (außer bei einigen Terminalemulatoren, die die $SHELLEinstellung nicht befolgen). Sie haben aber immer noch , shwenn Sie sich über SSH anmelden. Dies kann durch Einbinden exec zsham 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 ~/.profilevon 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 sshdoder ist su, ist es sicher, exec).

Die einfachste Lösung, sowohl mit zsh zu arbeiten als auch es auszuführen, ~/.profilebesteht darin, ein zu erstellen, ~/.zprofiledas 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'.

.zprofileVergleiche.zshrc

Die Datei ~/.profilewird 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 chshBefehl oder über ein anderes Tool wie die „Benutzereinstellungen“ in Ubuntu ändern. Wenn es sich um eine Login-Shell handelt, liest Bash, ~/.bash_profilewenn 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 ~/.profilewird 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 ~/.zshrcin allen interaktiven Shells, egal ob es sich um Login-Shells handelt oder nicht; bash liest seltsamerweise nie ~/.bashrcin Login-Shells.)

Enthält normalerweise ~/.profileDefinitionen von Umgebungsvariablen und startet möglicherweise einige Programme, die Sie einmal beim Anmelden oder während der gesamten Sitzung ausführen möchten. ~/.zshrcEnthä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:

  1. ~/.profilewird beim zshLogin nicht geladen.
  2. zshwird beim Login geladen ~/.zprofile.
  3. zsh~/.zshrcwird 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/profileund ~/.profilefü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 ~/.zprofilejedoch):

% 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...

verwandte Informationen