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?
.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.
~/.profile
n'est pas chargé par zsh
lors de la connexion.zsh
charge ~/.zprofile
au moment de la connexion.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!
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.
J'ai .zprofile
compatible avec .profile
(ne contient que des modifications de PATH), il suffit donc de:
ln -s .profile .zprofile
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...