276 votes

Zsh n'atteint pas ~/.profile

Je viens d'installer zsh sur mon système Ubuntu. Il semble que zsh n'exécute pas ~/.profile lors de l'init. Selon ma meilleure compréhension, cela devrait être un comportement automatique. Qu'est-ce qui me manque ?

375voto

.profile vs. .zprofile

Zsh exécute ~/.zprofile pas ~/.profile lorsqu'il est invoqué comme un Shell de connexion. La raison est que zsh a suffisamment d'incompatibilités avec les shells standards pour casser les Shell.

Zsh exécute ~/.profile s'il est appelé comme sh o ksh . Mais si votre objectif est d'obtenir une invite zsh lorsque vous vous connectez, cela ne vous aidera pas.

Vous pouvez faire /bin/sh votre login Shell et inclure export SHELL=/bin/zsh dans votre ~/.profile . Ensuite, lorsque vous ouvrez un terminal, celui-ci lancera zsh (à l'exception de quelques émulateurs de terminaux qui n'obéissent pas à la règle de l'anonymat). $SHELL réglage). Mais vous aurez toujours sh lorsque vous vous connectez via ssh. Ceci peut être corrigé en incluant exec zsh à la fin de ~/.profile (cela remplace l'exécution de Shell par zsh), mais vous devez faire attention à ne le faire que pour les connexions interactives et non pas quand ~/.profile est inclus à partir d'autres scripts tels que le démarrage de la session X (un bon test est le nom du processus parent obtenu par ps -o comm= $PPID : si c'est sshd o su alors c'est sûr de exec ).

La solution la plus simple pour à la fois travailler avec zsh et exécuter ~/.profile est de créer un ~/.zprofile qui entre en mode émulation pendant qu'il fonctionne ~/.profile :

emulate sh
. ~/.profile
emulate zsh

Si vous avez un zsh assez récent (sur Ubuntu, cela veut dire depuis lucid, je pense), vous pouvez simplifier cela à emulate sh -c '. ~/.profile' .

.zprofile vs. .zshrc

Le dossier ~/.profile est chargé par connexion coquilles. Le login Shell est le premier processus qui est 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 login Shell est bash, mais vous pouvez le changer avec la commande chsh ou par le biais d'un autre outil tel que "User Settings" dans Ubuntu. Quand c'est un login Shell, bash lit ~/.bash_profile s'il existe et ~/.profile alors que zsh ne lit que ~/.zprofile (car sa syntaxe n'est pas complètement compatible avec un sh traditionnel). Dans la plupart des configurations, ~/.profile est également chargé par le démarrage de la session X scripts lorsque vous vous connectez dans un gestionnaire d'affichage graphique.

Lorsque vous démarrez un émulateur de terminal et obtenez une invite Shell, ou lorsque vous démarrez un Shell explicitement, vous obtenez un Shell qui n'est pas un Shell de connexion. Depuis ~/.profile (ou ~/.zprofile ) est destiné aux commandes que vous voulez exécuter lorsque vous vous connectez, un Shell non connecté ne lit pas ce fichier. Au lieu de cela, lorsque vous lancez un zsh interactif, il lit ~/.zshrc . (Zsh lit ~/.zshrc dans tous les shells interactifs, qu'ils soient des shells de connexion ou non ; bash, étrangement, ne lit jamais ~/.bashrc dans les coquilles de connexion).

Typiquement, ~/.profile contient des définitions de variables d'environnement et peut lancer certains programmes que vous souhaitez exécuter une seule fois lorsque vous vous connectez ou pour toute la session ; ~/.zshrc contient les choses qui doivent être faites pour chaque instance de Shell, comme les définitions d'alias et de fonctions, les paramètres des options de Shell, les paramètres de complétion, les paramètres d'invite, les liaisons de touches, etc.

176voto

Karl Morrison Points 2475

Réponse courte pour les personnes impatientes :

  1. ~/.profile n'est pas chargé par zsh à la connexion.
  2. zsh charges ~/.zprofile à la connexion.
  3. zsh charges ~/.zshrc lors du démarrage d'une nouvelle session de terminal.

Vous avez besoin de plus d'informations ? Regardez la superbe réponse de Gilles !

31voto

Lindholm Points 231

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

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

...Ce qui va générer le fichier .profile avec le mode sh de zsh en vigueur. Et il n'est actif que pendant la source. Vous n'avez donc pas besoin de sauvegarder l'état actuel de l'option pour le rejouer après le sourçage.

11voto

Igor Shubovych Points 201

J'ai .zprofile compatible avec .profile (qui ne contient que les changements de PATH), d'où le besoin de seulement :

ln -s .profile .zprofile

2voto

Chris Johnsen Points 36743

El zsh /etc/profile y ~/.profile pour les shells de connexion dans sh / ksh mode de compatibilité.

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

Connexion en mode natif Shell (argv[0] commence par - ) n'utilise pas ~/.profile (il utilisera ~/.zprofile cependant) :

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

(pas de sortie)

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X