Question Zsh ne touche 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?


106
2017-09-12 07:20


origine




Réponses:


.profile contre. .zprofile

Zsh s'exécute ~/.zprofile, ne 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 fonctionne ~/.profile si on l'appelle comme sh ou ksh. Mais si votre objectif est d'obtenir une invite zsh lorsque vous vous connectez, ce n'est pas une aide.

Tu peux faire /bin/sh votre shell de connexion et inclure export SHELL=/bin/zsh dans ton ~/.profile. Ensuite, lorsque vous ouvrez un terminal, le terminal lance zsh (à l’exception de quelques émulateurs de terminaux qui ne $SHELL réglage). Mais vous aurez toujours sh lorsque vous vous connectez sur ssh. Cela peut être corrigé en incluant exec zsh au bout du ~/.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 ~/.profile est inclus à partir d'autres scripts tels que le début de la 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 de exec).

La solution la plus simple pour 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 signifie depuis lucide, je pense), vous pouvez simplifier cela pour emulate sh -c '. ~/.profile'.

.zprofile contre. .zshrc

Le fichier ~/.profile est chargé par s'identifier coquilles. Le shell de connexion est le premier processus démarré 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 changer avec le chsh commande, ou via un autre outil tel que "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 complètement compatible avec un sh traditionnel). Sous la plupart des configurations, ~/.profile est également chargé par les scripts de démarrage de la session X lorsque vous vous connectez à un gestionnaire d'affichage graphique.

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

Typiquement, ~/.profile contient des définitions de variables d'environnement et peut démarrer certains programmes que vous souhaitez exécuter une fois lorsque vous vous connectez ou pour toute la session; ~/.zshrc contient des choses à faire pour chaque instance de shell, telles que des définitions d'alias et de fonctions, des paramètres d'options de shell, des paramètres d'achèvement, des paramètres d'invite, des raccourcis clavier, etc.


152
2017-09-12 10:37



Très bonne réponse! J'ai créé ~ / .zprofile et mis la ligne comme vous l'avez suggéré, mais cela ne semble rien faire. Peut-être devrais-je le mettre dans .zshrc? - shmichael
@shmichael: Compte tenu de votre réaction, je n'ai peut-être pas interprété votre question comme vous le souhaitiez. Est-ce que la deuxième section que j'ai ajoutée à ma réponse aide? - Gilles
oui, frapper sur place Donc, si je comprends bien, je voudrais par exemple Déclarations PATH sur .zprofile et alias sur .zshrc. - shmichael
@ user1419674 Merci pour la correction, mais ne pas ajouter de journal de modifications aux posts. Le site a un historique de révision intégré. - Gilles


Réponse courte pour les gens impatients:

  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.

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


40
2018-03-21 13:38



+2 pour une réponse rapide et lisible - dreftymac


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

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

... qui va générer le fichier .profile avec le sh-mode de zsh en vigueur. Et ce n'est actif que pendant la source. Vous n'avez donc pas besoin de sauvegarder l'état de l'option en cours pour le relire à nouveau après le sourcing.


16
2018-03-09 22:20



Je l'ai dans mon ~ / .zprofile, mais pour une raison quelconque, les instructions dans ~ / .profile ne sont pas disponibles dans mon shell. Ubuntu 15.04; zsh 5.0.7 - friederbluemle
Difficile de diagnostiquer sans code. - Frank Terbeck
J'ai juste essayé à nouveau, et il semble que cela fonctionne maintenant. Je ne sais pas si cela a été corrigé à un moment ou à un autre. La version zsh est maintenant 5.1.1. - friederbluemle


j'ai .zprofile compatible avec .profile (ne contient que des modifications de PATH), ne nécessitant donc que:

ln -s .profile .zprofile

4
2018-04-14 15:30





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

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

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

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

(aucune sortie)

sh/ksh mode de compatibilité Les shells de connexion utilisent .profile:

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

0
2017-09-12 09:20