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 ?
Réponses
Trop de publicités?
.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.
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.
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...