Réponses:
.profile
contre. .zprofile
Zsh ne s'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 est exécuté ~/.profile
s'il s'appelle as 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 faire /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 n'obéissent pas aux $SHELL
paramètres). Mais vous aurez toujours sh
quand 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 ~/.profile
est 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 sshd
ou su
, alors c'est sans danger exec
).
La solution la plus simple à la fois de travailler avec zsh et d’exécuter ~/.profile
consiste à créer un ~/.zprofile
mode 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 ~/.profile
est 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 chsh
commande 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_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 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 ~/.zshrc
dans tous les shells interactifs, qu'il s'agisse de shells de connexion ou non; bash, étrangement, ne lit jamais ~/.bashrc
dans des shells de login.)
En règle générale, ~/.profile
contient 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. ~/.zshrc
contient 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.
~/.profile
n'est pas chargé par zsh
à la connexion.zsh
se charge ~/.zprofile
à la connexion.zsh
se 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 relire après le sourcing.
Je suis .zprofile
compatible avec .profile
(ne contient que les modifications de PATH), donc seulement besoin de:
ln -s .profile .zprofile
La zsh documentation que j'ai sous la main ne mentionne que /etc/profile
et ~/.profile
pour 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 ~/.zprofile
bien):
% 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...