it-swarm.com.de

Zsh trifft nicht ~/.profile

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?

125
shmichael

.profile vs. .zprofile

Zsh führt ~/.zprofile und nicht ~/.profile aus, wenn es als Anmeldeshell aufgerufen wird. Der Grund dafür ist, dass zsh genug Inkompatibilitäten mit Standard-Shells aufweist, um Skripte zu brechen.

Zsh führt ~/.profile aus, wenn es als sh oder ksh bezeichnet wird. Wenn Ihr Ziel jedoch darin besteht, beim Anmelden eine zsh-Eingabeaufforderung zu erhalten, ist dies keine Hilfe.

Sie können /bin/sh zu Ihrer Login-Shell machen und export Shell=/bin/zsh in Ihren ~/.profile aufnehmen. Wenn Sie dann ein Terminal öffnen, startet das Terminal zsh (mit Ausnahme einiger Terminalemulatoren, die die Einstellung $Shell nicht einhalten). Aber Sie haben immer noch sh, wenn Sie sich über ssh anmelden. Dies kann behoben werden, indem exec zsh am Ende von ~/.profile eingefügt wird (dies ersetzt die laufende Shell durch zsh). Sie müssen jedoch darauf achten, dies nur für interaktive Anmeldungen zu tun und nicht, wenn ~/.profile aus anderen Skripten wie dem Start der X-Sitzung eingefügt wird (Ein guter Test ist der Name des übergeordneten Prozesses, den ps -o comm= $PPID ermittelt hat. Wenn es sich um sshd oder su handelt, ist es sicher, exec zu verwenden.).

Die einfachste Lösung, um mit zsh zu arbeiten und ~/.profile auszuführen, besteht darin, einen ~/.zprofile zu erstellen, der in den Emulationsmodus wechselt, während ~/.profile ausgeführt wird:

emulate sh
. ~/.profile
emulate zsh

Wenn Sie in letzter Zeit genug zsh haben (unter Ubuntu bedeutet das, dass ich es als klar bezeichne), können Sie dies zu emulate sh -c '. ~/.profile' vereinfachen.

.zprofile vs. .zshrc

Die Datei ~/.profile wird von login shells geladen. Die Login-Shell ist der erste Prozess, der gestartet wird, wenn Sie sich im Textmodus anmelden, z. B. 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 Befehl chsh oder mit einem anderen Tool wie den „Benutzereinstellungen“ in Ubuntu ändern. Wenn es sich um eine Login-Shell handelt, liest bash ~/.bash_profile, falls vorhanden, und ~/.profile, wohingegen zsh nur ~/.zprofile liest (da seine Syntax nicht vollständig mit einer herkömmlichen sh kompatibel ist). In den meisten Konfigurationen wird ~/.profile 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 Anmeldeshell ist. Da ~/.profile (oder ~/.zprofile) für Befehle bestimmt ist, die Sie beim Anmelden ausführen möchten, liest eine Shell ohne Anmeldung diese Datei nicht. Wenn Sie ein interaktives zsh starten, wird stattdessen ~/.zshrc gelesen. (Zsh liest ~/.zshrc in allen interaktiven Shells, unabhängig davon, ob es sich um Login-Shells handelt. Seltsamerweise liest bash niemals ~/.bashrc in Login-Shells.)

In der Regel enthält ~/.profile Umgebungsvariablendefinitionen und startet möglicherweise einige Programme, die Sie einmal ausführen möchten, wenn Sie sich anmelden oder während der gesamten Sitzung. ~/.zshrc enthält Aufgaben, die für jede Shell-Instanz ausgeführt werden müssen, z. B. Alias- und Funktionsdefinitionen, Shell-Optionseinstellungen, Vervollständigungseinstellungen, Eingabeaufforderungseinstellungen, Tastenzuordnungen usw.

180
Gilles

Kurze Antwort für ungeduldige Menschen:

  1. ~/.profile wird bei der Anmeldung nicht von zsh geladen.
  2. zsh lädt ~/.zprofile bei der Anmeldung.
  3. zsh lädt ~/.zshrc beim Starten einer neuen Terminalsitzung.

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

54
Karl Morrison

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.

19
Frank Terbeck

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

ln -s .profile .zprofile
5
Igor Shubovych

DiezshDokumentation, die ich zur Hand habe, erwähnt nur /etc/profile und ~/.profile für Login-Shells imsh/kshKompatibilitätsmodus.

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

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

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

(keine Leistung)

sh / ksh compatability mode login shells verwendet .profile:

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