/ etc / profile n'est pas source

45

Pour 11.04, j'ai fait une nouvelle installation de mon système. Une partie de cette installation a été d'installer RVM , qui colle un rvm.shdans /etc/profile.d/. Cela ne fonctionne pas car /etc/profile(qui charge chaque + r /etc/profile.d/*.sh) n'est pas en cours de chargement. Selon la documentation, le profil n'est créé que si bash est exécuté en connexion. Pour vérifier cela, j'ai appelé bash --login, après quoi rvmétait disponible.

Cela a fonctionné pour moi dans les versions précédentes d'Ubuntu sans configuration. C'est-à-dire qu'une nouvelle installation de 10.10 générera correctement le profil source / .d.

Ma question est la suivante: y a-t-il quelque chose que je fais mal ou y a-t-il de nouvelles hypothèses faites dans Natty qui ont cassé cela? Ma solution actuelle est source /etc/profiledans ~/.bashrc( ce qui est terrible que le profil est destiné à la charge avant de bashrc, mais le tour est joué).

Marc
la source

Réponses:

52

Par défaut, gnome-terminal ne démarre pas bash en tant que shell de connexion (je suppose que vous voulez dire que bash a démarré à l'intérieur d'un gnome-terminal). Cela signifie que bash ne lira pas /etc/profileou ~/.profile. Comme vous l'avez correctement observé, bash lira ces fichiers s'il est lancé en tant que shell de connexion.

La solution rapide à votre problème consiste à configurer gnome-terminal pour qu'il démarre bash en tant que shell de connexion afin qu'il puisse le lire /etc/profile. Pour ce faire, vous devez activer "Exécuter la commande en tant que shell de connexion" dans le "Préférences de profil" de gnome-terminal accessible depuis le menu Edition.

Je ne recommande pas cela car cela gâche la distinction entre ~/.profileet ~/.bashrc. Idéalement, vous ~/.profiledevriez faire des choses qui ne sont nécessaires qu’une fois, lors de la connexion, tandis que vous ~/.bashrcdevriez faire des choses qui sont nécessaires à chaque démarrage de bash.

Il y a une question et une réponse chez le superutilisateur qui parle de la différence entre bashrc et profile . Lisez-le pour plus d'informations.

D'après votre description du problème, il semble que le script rvm n'ait besoin d'être chargé qu'une seule fois, lors de la connexion. Autant que je sache, Ubuntu a configuré le login graphique pour lire /etc/profile/et ~/.profile. Cela signifie que, après la déconnexion et une connexion une fois, le script rvm doit être actif. Si cela ne fonctionne toujours pas, alors le script rvm doit peut-être être chargé pour chaque session bash. Si tel est le cas, bashrcc'est l'endroit le plus approprié pour le script.

lesmana
la source
La définition de 'exécuter la commande en tant que shell de connexion' s'est effectivement chargée /etc/profile(et donc celle du fichier .d). Merci pour l'explication - il semble que cela nécessite un suivi auprès des gens de RVM.
Marc
7
Ubuntu 11.04 ne semble pas lire /etc/profileet ~/.profilependant la connexion. C'est étrange car cela a toujours fonctionné avec les anciennes versions. Je pense que ce n'est pas une solution mais une solution de contournement.
Luca
2
@lesmana Existe-t-il un moyen d'activer "Exécuter la commande en tant que shell de connexion" à partir de la CLI au lieu de l'interface graphique? Je suis connecté à un serveur distant et je ne peux pas transférer X localement.
Waseem
5

Cependant, il existe un fichier /etc/bash.bashrc lu par gnome-terminal et constituant le "fichier .bashrc à l’échelle du système pour les shells interactifs bash (1)".

Mon appel à la fonction RVM [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm", est passé par là et fonctionne parfaitement pour les quelques utilisateurs de ce système.

Dmitri
la source
gnome-terminal ne fait rien de tel. gnome-terminal exécute bash (ou quel que soit votre shell de connexion défini dans la base de données passwd) en mode interactif, et bash a démarré une lecture interactive /etc/bash.bashrc. Eh bien, au moins sur Debian / Ubuntu. Bash normalement ne lit pas un bashrc à l’échelle du système; Debian l'a corrigé pour le faire.
geirha
@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Mar 14 févr. 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Fichier .bashrc à l’échelle du système pour les shells interactifs bash (1). # Pour activer également les paramètres / commandes de ce fichier pour les shells de connexion, # ce fichier doit provenir de / etc / profile. # Si vous ne jouez pas de manière interactive, ne faites rien [-z "$ PS1"] && return .....
Dmitri
2
Oui, évidemment, gnome-terminal appelle bash pour lire ce fichier: si votre shell est ksh, alors gnome-terminal ne lirait pas ce fichier, n'est-ce pas? Puis-je suggérer de rechercher le mot "pédant" dans le dictionnaire avant de continuer à utiliser des phrases provocantes telles que "ne fait rien de tel".
Dimitri
4

L'installation de RVM en tant qu'utilisateur multiple nécessite que l'utilisateur exécute cette commande:

(car Ubuntu ne source pas /etc/profile.d lors de la connexion)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc
utilisateur50486
la source
3
Ubuntu utilise les fichiers /etc/profile.d/lors de la connexion, car les /etc/profileboucles par défaut les parcourent, ainsi que les fichiers /etc/profile.d/. Cependant, si cela rvm.shcontient du code pour les shells interactifs, tels que des fonctions ou des alias, il /etc/profileest inutile de les rechercher. La configuration pour les sessions interactives doit être dans .bashrc.
geirha
0

si vous avez ZSH ou OH-MY-ZSH, votre profil est / etc / zprofile

Hadi Farnoud
la source
0

J'ai effectivement trouvé pour ceux qui n'aiment pas redémarrer complètement leurs boites à moins que ce ne soit absolument nécessaire ce qui suit ...

Vous n'avez pas besoin de redémarrer la machine entière pour que les modifications /etc/profileprennent effet. Tout ce dont vous avez besoin est de faire redémarrer votre interface graphique XWindows Desktop pour qu'il relise les configurations (comme s'il le faisait s'il devait être démarré dans le cadre d'un redémarrage à l'échelle du système).

Pour moi, j'utilise xUbuntu, qui utilise LightDM, mais vous pouvez utiliser n'importe quel exécutable qui appelle votre bureau actuel.

Premièrement, vous ne pouvez pas utiliser un émulateur de terminal à partir de l'interface graphique du bureau lui-même (du moins pas avec LightDM), vous devez utiliser SSH ou une console secondaire (si vous maintenez les touches Ctrl + Alt enfoncées et que vous appuyez sur une touche F ou numérique vous devez abandonner votre connexion graphique au bureau ou passer d’un écran à une fenêtre de terminal ordinaire). Je vous suggère également de fermer tout élément de bureau distant tel que VNC si vous utilisez SSH (vous pouvez évidemment vous connecter à SSH, vous ne voulez pas qu'une fenêtre ouverte de VNC interroge l'affichage 0 alors qu'il tente de redémarrer car cela pourrait suspendre le redémarrage il attend que vous terminiez la session VNC).

Je fais cela tout le temps avec SSH et c'est une grande bouée de sauvetage, en particulier lorsque vous n'êtes pas physiquement à côté de votre machine et que vous n'avez pas envie d'attendre un redémarrage complet et de vous reconnecter :-D

Maintenant la partie facile une fois dans un problème "secondaire" de terminal ou SSH: (Oui, cela va tuer votre session en cours, assurez-vous de ne pas vous déranger, sauvegardez tous les documents ouverts ou travaillez)

sudo service lightdm restart

attendez une minute car il tue le bureau, puis le redémarre (cela peut prendre quelques bonnes secondes car les choses sont arrêtées puis réexécutées au démarrage)

Ça y est, maintenant, lorsque vous revenez à la console 0 ou que vous allez utiliser VNC pour vous connecter à nouveau, vous serez accueillis par l'invite de connexion. Une connexion normale s'ouvrira. Si vous ouvrez un émulateur de terminal et que vous passez votre commande, vous devriez maintenant n'ayez aucun problème, car tout a été re-sourcé comme si vous redémarriez complètement votre machine.

Rappelez-vous simplement que si vous lancez sudo service lightdm restart[ou stop, startquel que soit] à partir de l'environnement de bureau lui-même à l'aide d'un émulateur de terminal, la commande sera suspendue et rien ne semblera se passer. Cela est dû au fait que vous utilisez actuellement cette console (affichage) 0 et qu’elle ne peut donc pas complètement disparaître et revenir car elle attend que le poste de travail ne soit pas utilisé avant d’exécuter la commande.

Dernière remarque: je n'ai pas essayé d'émettre de redémarrage sur l'environnement à partir du bureau dans un émulateur de terminal, puis de basculer vers une autre console susceptible de le redémarrer, mais si vous allez déjà changer de console, pourquoi ne pas simplement exécuter la commande de là comme il se doit de toute façon?

Paria
la source
-4

echo ".profile" >> ~ / .bashrc

Et puis ouvrez une autre fenêtre. Je pense que c'est l'approche facile.

chris
la source
1
Étant donné que les .profilesources par défaut .bashrc, cela entraînerait une boucle pour la plupart des utilisateurs.
Muru