Zsh ne frappe pas ~ / .profile

145

Je viens d'installer zsh sur mon système Ubuntu. Il semble que zsh n'exécute pas ~ / .profile sur init. À ma connaissance, cela devrait être un comportement automatique. Qu'est-ce que je rate?

shmichael
la source

Réponses:

204

.profile contre. .zprofile

Zsh ne s'exécute ~/.zprofilepas ~/.profilelorsqu'il est appelé en tant que shell de connexion. La raison en est que zsh a suffisamment d’incompatibilités avec les shells standard pour casser les scripts.

Zsh est exécuté ~/.profiles'il s'appelle as shou ksh. Mais si votre objectif est d'obtenir une invite zsh lorsque vous vous connectez, ce n'est pas une aide.

Vous pouvez faire /bin/shvotre shell de connexion et inclure export SHELL=/bin/zshdans votre ~/.profile. Ensuite, lorsque vous ouvrez un terminal, celui-ci lancera zsh (à l'exception de quelques émulateurs de terminal qui n'obéissent pas aux $SHELLparamètres). Mais vous aurez toujours shquand vous vous connectez sur ssh. On peut remédier à cela en ajoutant exec zshà la fin de ~/.profile(cela remplace le shell en cours d’exécution par zsh), mais vous devez faire attention à ne le faire que pour les connexions interactives et non lorsque cela ~/.profileest inclus dans d’autres scripts tels que le début de session X test est le nom du processus parent obtenu par ps -o comm= $PPID: si c'est sshdou su, alors c'est sans danger exec).

La solution la plus simple à la fois de travailler avec zsh et d’exécuter ~/.profileconsiste à créer un ~/.zprofilemode d’émulation qui entre en mode sh lorsqu'il est exécuté ~/.profile:

emulate sh
. ~/.profile
emulate zsh

Si vous avez un zsh assez récent (sur Ubuntu, cela signifie que lucide, je pense), vous pouvez le simplifier emulate sh -c '. ~/.profile'.

.zprofile contre. .zshrc

Le fichier ~/.profileest chargé par les shells de connexion . Le shell de connexion est le premier processus lancé lorsque vous vous connectez en mode texte, par exemple sur une console texte ou via ssh. Par défaut, sur la plupart des machines Linux, le shell de connexion est bash, mais vous pouvez le modifier à l'aide de la chshcommande ou via un autre outil tel que les «Paramètres de l'utilisateur» dans Ubuntu. Quand il s’agit d’un shell de connexion, bash lit ~/.bash_profiles’il existe et ~/.profilealors que zsh ne lit que ~/.zprofile(car sa syntaxe n’est pas complètement compatible avec un sh traditionnel). Dans la plupart des configurations, ~/.profileest également chargé par les scripts de démarrage de session X lorsque vous vous connectez à un gestionnaire d'affichage graphique.

Lorsque vous démarrez un émulateur de terminal et obtenez une invite du shell, ou lorsque vous démarrez un shell explicitement, vous obtenez un shell qui n'est pas un shell de connexion. Puisque ~/.profile(ou ~/.zprofile) est destiné aux commandes que vous souhaitez exécuter lorsque vous vous connectez, un shell autre que celui de connexion ne lit pas ce fichier. Au lieu de cela, lorsque vous démarrez un zsh interactif, il se lit comme suit ~/.zshrc. (Zsh lit ~/.zshrcdans tous les shells interactifs, qu'il s'agisse de shells de connexion ou non; bash, étrangement, ne lit jamais ~/.bashrcdans des shells de login.)

En règle générale, ~/.profilecontient les définitions de variable d'environnement et peut démarrer certains programmes que vous souhaitez exécuter une fois lorsque vous vous connectez ou pour l'ensemble de la session. ~/.zshrccontient les tâches à effectuer pour chaque instance de shell, telles que les définitions d'alias et de fonctions, les paramètres d'option de shell, les paramètres d'achèvement, les paramètres d'invite, les raccourcis clavier, etc.

Gilles
la source
Très bonne réponse! J'ai créé ~ / .zprofile et mis la ligne comme vous l'avez suggéré, mais cela ne semble rien faire. Peut-être que je devrais le mettre dans .zshrc?
Shmichael
1
@shmichael: Compte tenu de votre réaction, je n'ai peut-être pas interprété votre question comme vous le souhaitiez. La deuxième section que j'ai ajoutée à ma réponse aide-t-elle?
Gilles
oui, frappe la tache. Donc, si je comprends bien, je voudrais par exemple les déclarations PATH sur .zprofile et les alias sur .zshrc.
Shmichael
@ user1419674 Merci pour la correction, mais n'ajoutez pas de journal des modifications aux publications. Le site a un historique de révision intégré.
Gilles
69

Réponse courte pour les impatients:

  1. ~/.profilen'est pas chargé par zshà la connexion.
  2. zshse charge ~/.zprofileà la connexion.
  3. zshse charge ~/.zshrclors du démarrage d’une nouvelle session de terminal.

Besoin de plus d'informations? Regardez la superbe réponse de Gilles!

Karl Morrison
la source
Très bonne réponse. Juste ce dont vous avez besoin.
Django Reinhardt
21

En plus de la réponse de Gilles, vous pouvez faire ceci avec une version raisonnablement récente de zsh:

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

... Ce qui source le fichier .profile avec le mode sh de zsh en vigueur. Et ce n'est actif que pendant la source. Il n’est donc pas nécessaire de sauvegarder l’état actuel de l’option pour pouvoir le relire après le sourcing.

Frank Terbeck
la source
J'ai ceci dans mon ~ / .zofofile, mais pour une raison quelconque, les déclarations dans ~ / .profile ne sont pas disponibles dans mon shell. Ubuntu 15.04; vendredi 5.0.7
friederbluemle
Difficile à diagnostiquer sans code.
Frank Terbeck
Je viens d'essayer à nouveau, et il semble que cela fonctionne maintenant. Je ne sais pas si cela a été corrigé à un moment ou à un autre. La version de zsh est la version 5.1.1 maintenant.
friederbluemle
5

Je suis .zprofilecompatible avec .profile(ne contient que les modifications de PATH), donc seulement besoin de:

ln -s .profile .zprofile
Igor Shubovych
la source
0

La zsh documentation que j'ai sous la main ne mentionne que /etc/profileet ~/.profilepour les shells de connexion dans sh / ksh mode de compatibilité.

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

Le shell de connexion en mode natif (argv [0] commence par -) n'utilise pas ~/.profile(il utilisera ~/.zprofilebien):

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

(pas de sortie)

sh / ksh shells mode de compatibilité utilise .profile:

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