Zsh trifft nicht ~ / .profile

145

Ich habe gerade zsh auf meinem Ubuntu-System installiert. Es scheint, dass zsh ~ / .profile nicht auf init ausführt. Nach meinem besten Verständnis sollte dies ein automatisches Verhalten sein. Was vermisse ich?

Shmichael
quelle

Antworten:

204

.profile gegen .zprofile

Zsh wird ausgeführt ~/.zprofile, nicht ~/.profile, wenn es als Anmeldeshell aufgerufen wird. Der Grund dafür ist, dass zsh mit Standard-Shells nicht kompatibel genug ist, um Skripte zu brechen.

Zsh wird ausgeführt, ~/.profilewenn es als shoder aufgerufen wird ksh. Wenn Ihr Ziel jedoch darin besteht, beim Anmelden eine zsh-Eingabeaufforderung zu erhalten, ist dies keine Hilfe.

Sie können /bin/shIhre Login - Shell erstellen und export SHELL=/bin/zshin Ihre einbinden ~/.profile. Wenn Sie dann ein Terminal öffnen, startet das Terminal zsh (mit Ausnahme einiger Terminalemulatoren, die die $SHELLEinstellung nicht beachten ). Aber du wirst immer noch haben, shwenn du dich über ssh anmeldest. Dies kann durch Einfügen exec zsham Ende von behoben werden ~/.profile(dies ersetzt die laufende Shell durch zsh), aber Sie müssen vorsichtig sein, dies nur für interaktive Anmeldungen zu tun und nicht, wenn dies ~/.profileaus anderen Skripten wie dem X-Sitzungsstart (ein guter Wert) enthalten ist Test ist der Name des Prozesses Eltern erhalten durch ps -o comm= $PPID: wenn es sshdoder su, dann ist es sicher exec).

Die einfachste Lösung, um sowohl mit zsh als auch mit run zu arbeiten, ~/.profilebesteht darin, einen zu erstellen ~/.zprofile, der während der Ausführung in den sh-Emulationsmodus wechselt ~/.profile:

emulate sh
. ~/.profile
emulate zsh

Wenn du in letzter Zeit genug zsh hast (unter Ubuntu heißt das, da ich das klar finde), kannst du dies vereinfachen emulate sh -c '. ~/.profile'.

.zprofile gegen .zshrc

Die Datei ~/.profilewird von Login- Shells geladen . 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, aber Sie können sie mit dem chshBefehl oder mit einem anderen Tool wie den „Benutzereinstellungen“ in Ubuntu ändern . Wenn es sich um eine Login-Shell handelt, liest bash, ~/.bash_profileob sie existiert, und ~/.profile, während zsh nur lesbar ist ~/.zprofile(da seine Syntax nicht vollständig mit einer herkömmlichen sh kompatibel ist). Wird in den meisten Konfigurationen ~/.profileauch 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 Anmeldeshell ist. Da ~/.profile(oder ~/.zprofile) Befehle betrifft, die Sie beim Anmelden ausführen möchten, liest eine Shell ohne Anmeldung diese Datei nicht. Wenn Sie stattdessen ein interaktives zsh starten, wird es gelesen ~/.zshrc. (Zsh liest ~/.zshrcalle interaktiven Shells ein, unabhängig davon, ob es sich um Login-Shells handelt. Seltsamerweise liest bash niemals ~/.bashrcLogin-Shells ein.)

~/.profileEnthält normalerweise Umgebungsvariablendefinitionen und startet möglicherweise einige Programme, die Sie einmalig bei der Anmeldung oder während der gesamten Sitzung ausführen möchten. ~/.zshrcEnthält Aufgaben, die für jede Shell-Instanz ausgeführt werden müssen, z. B. Alias- und Funktionsdefinitionen, Einstellungen für Shell-Optionen, Vervollständigungseinstellungen, Einstellungen für Eingabeaufforderungen, Tastenzuordnungen usw.

Gilles
quelle
Gute Antwort! Ich habe ~ / .zprofile erstellt und die Zeile so eingefügt, wie Sie es vorgeschlagen haben, aber sie scheint nichts zu bewirken. Vielleicht sollte ich es in .zshrc setzen?
Shmichael
1
@shmichael: Angesichts Ihrer Reaktion habe ich Ihre Frage möglicherweise nicht so interpretiert, wie Sie es beabsichtigt haben. Hilft der zweite Abschnitt, den ich zu meiner Antwort hinzugefügt habe?
Gilles
Ja, genau das Richtige. Wenn ich das richtig verstehe, möchte ich zB PATH-Deklarationen für .zprofile und Aliase für .zshrc.
Shmichael
@ user1419674 Vielen Dank für die Korrektur, aber fügen Sie keine Änderungsprotokolle zu Beiträgen hinzu. Die Site verfügt über einen integrierten Revisionsverlauf.
Gilles
69

Kurze Antwort für ungeduldige Menschen:

  1. ~/.profilewird zshbei der Anmeldung nicht geladen .
  2. zshwird ~/.zprofilebeim Login geladen.
  3. zshwird ~/.zshrcbeim Starten einer neuen Terminalsitzung geladen.

Benötigen Sie weitere Informationen? Schau dir Gilles 'großartige Antwort an!

Karl Morrison
quelle
Gute Antwort. Genau das, was Sie brauchen.
Django Reinhardt
21

Zusätzlich zu Gilles 'Antwort können Sie dies mit einer einigermaßen aktuellen Version von zsh tun:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... Wodurch die .profile-Datei mit dem Sh-Modus von zsh erzeugt wird. Und es ist nur während der Quelle aktiv. Sie müssen den aktuellen Optionsstatus also nicht speichern, um ihn nach dem Sourcing erneut abzuspielen.

Frank Terbeck
quelle
Ich habe dies in meinem ~ / .z-Profil, aber aus irgendeinem Grund sind die Anweisungen in ~ / .profile in meiner Shell nicht verfügbar. Ubuntu 15.04; zsh 5.0.7
friederbluemle
Ohne Code schwer zu diagnostizieren.
Frank Terbeck
Ich habe es gerade noch einmal versucht und es sieht so aus, als würde es jetzt funktionieren. Ich bin mir nicht sicher, ob es irgendwann behoben wurde oder was passiert ist. zsh Version ist jetzt 5.1.1.
Friederblümle
5

Ich bin .zprofilekompatibel mit .profile(enthält nur PATH-Änderungen) und benötige daher nur:

ln -s .profile .zprofile
Igor Shubovych
quelle
0

Die zsh Dokumentation ich zur Hand haben nur erwähnt /etc/profileund ~/.profilefür Login - Shells in sh / KSH - Kompatibilitätsmodus.

% zsh --version
zsh 4.3.10 
% cat ~/.profile
echo 'Running ~/.profile...'

Anmeldeshell im einheitlichen Modus (argv [0] beginnt mit -) wird nicht verwendet ~/.profile(es wird jedoch verwendet ~/.zprofile):

% zsh -c 'exec -a -zsh zsh' </dev/null

(keine Leistung)

sh / KSH Kompatibilitätsmodus Login - Shells verwendet .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
Chris Johnsen
quelle