web-dev-qa-db-fra.com

Zsh ne frappe pas ~/.profile

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?

125
shmichael

.profile contre .zprofile

Zsh exécute ~/.zprofile, pas ~/.profile, lorsqu'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 exécute ~/.profile s'il est appelé en tant que sh ou ksh. Mais si votre objectif est d'obtenir une invite zsh lorsque vous vous connectez, ce n'est pas une aide.

Vous pouvez définir /bin/sh votre shell de connexion 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 terminal qui ne respectent pas le paramètre $Shell). Mais vous aurez toujours sh lorsque vous vous connecterez 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 ~/.profile est inclus dans d'autres scripts tels que le démarrage de session X (Un bon test est le nom du processus parent obtenu par ps -o comm= $PPID: si c'est sshd ou su, alors c'est sûr à exec).

La solution la plus simple pour travailler avec zsh et exécuter ~/.profile consiste à créer un ~/.zprofile qui entre en mode d'émulation sh lorsqu'il exécute ~/.profile:

emulate sh
. ~/.profile
emulate zsh

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

.zprofile contre .zshrc

Le fichier ~/.profile est chargé par login shells. 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 commande chsh ou d'un autre outil, tel que les «Paramètres utilisateur» dans Ubuntu. Quand il s’agit d’un shell de connexion, bash lit ~/.bash_profile s’il existe et ~/.profile, alors que zsh ne lit que ~/.zprofile (car sa syntaxe n’est pas totalement compatible avec un sh traditionnel). ~/.profile est é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. Étant donné que ~/.profile (ou ~/.zprofile) est destiné aux commandes que vous souhaitez exécuter lorsque vous vous connectez, un shell non connecté ne lit pas ce fichier. Au lieu de cela, lorsque vous démarrez un zsh interactif, il se lit ~/.zshrc. (Zsh lit ~/.zshrc dans tous les shells interactifs, qu'il s'agisse de shells de connexion ou non, bash, étrangement, ne lit jamais ~/.bashrc dans les shells de login.)

~/.profile contient généralement des 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; ~/.zshrc contient les tâches à effectuer pour chaque instance du shell, telles que les définitions d'alias et de fonctions, les paramètres d'option du shell, les paramètres d'achèvement, les paramètres d'invite, les raccourcis clavier, etc.

180
Gilles

Réponse courte pour les impatients:

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

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

54
Karl Morrison

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 rejouer après le sourcing.

19
Frank Terbeck

J'ai .zprofile compatible avec .profile (ne contient que des modifications de PATH), il suffit donc de:

ln -s .profile .zprofile
5
Igor Shubovych

La documentation zsh que j’ai sous la main ne mentionne que /etc/profile et ~/.profile pour les shells de connexion en mode sh / ksh mode de compatibilité.

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

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

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

(aucune sortie)

sh / ksh shell de connexion en mode compatibilité utilise .profile:

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