Ajouter un répertoire à $ PATH dans CentOS?

84

Nous venons tout juste de mettre nos nouveaux serveurs en service et nous utilisons tous CentOS. Après avoir installé Ruby Enterprise Edition avec succès, j'aimerais maintenant ajouter le /usr/lib/ruby-enterprise/binrépertoire REE / bin (situé à ) pour en faire l'interpréteur Ruby par défaut sur le serveur.

J'ai essayé ce qui suit, qui ne fait que l'ajouter à la session actuelle du shell:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Quelle serait la bonne approche pour ajouter de manière permanente ce répertoire à $ PATH pour tous les utilisateurs . Je suis actuellement connecté en tant que root.

Merci d'avance!

Vonconrad
la source

Réponses:

116

Ce n'est pas une bonne idée de modifier /etc/profilece genre de choses, car vous perdrez toutes vos modifications chaque fois que CentOS publiera une mise à jour pour ce fichier. C'est exactement ce qui /etc/profile.dest pour:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Reconnectez-vous et profitez de votre PATH mis à jour (en toute sécurité):

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Au lieu de vous reconnecter, vous pouvez recharger le profil:

# . /etc/profile

Cela mettra à jour la $PATHvariable.

Mike
la source
1
~/.profileest une autre option valable aussi
Zypher
4
Oui, pour un utilisateur unique. Mais la question portait sur la modification de PATH pour tous les utilisateurs.
Mike
2
@ Mike Quelle est cette commande pathmunge?
Nickolai Leschov
@ NickolaiLeschov Je suis sûr qu'il ajoute un chemin à $ PATH.
Mike
@ NickolaiLeschov c'est une fonction qui est définie dans / etc / profile
CrazyPheel
11

Après avoir suivi les conseils de fmonk, j’ai vérifié /etc/bashrc, et j’ai remarqué qu’il était écrit que "tout ce qui concerne l’ environnement va dans / etc / profile". J'ai commencé à regarder /etc/profile, j'ai vu ceci:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Pour résoudre mon problème, j'ai simplement ajouté pathmunge /usr/lib/ruby-enterprise/binsous la déclaration if. Cela a résolu mon problème.

Vonconrad
la source
Quelqu'un pourrait-il expliquer ce que "$EUID" = "0"signifie le moyen dans ce contexte?
Eli
EUID 0 signifie que l'utilisateur est root.
bbaja42
6
Vous auriez dû utiliser /etc/profile.d. Voir ma réponse ci-dessous.
Mike
Veuillez envisager d’accepter la réponse de @MikeConigliaro comme étant correcte. Son chemin est le bon. Il a été développé pour fonctionner de cette façon. Jetez un coup d'œil aux fichiers du /etc/profile.d/dossier et vous le remarquerez. En outre, comme il l’a dit, une mise à jour du système pourrait annuler votre solution.
Caio Cunha
4

"Un shell de connexion interactif est lancé après une connexion réussie, en utilisant / bin / login, en lisant le fichier / etc / passwd. Cette invocation de shell lit normalement / etc / profile et son équivalent privé ~ / .bash_profile au démarrage.

Un shell interactif sans connexion est normalement démarré sur la ligne de commande à l'aide d'un programme shell (par exemple, [prompt] $ / bin / bash) ou par la commande / bin / su. Un shell interactif sans connexion est également démarré avec un programme terminal tel que xterm ou konsole à partir d'un environnement graphique. Ce type d’appel de shell copie normalement l’environnement parent, puis lit le fichier ~ / .bashrc de l’utilisateur pour des instructions de configuration de démarrage supplémentaires. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Par conséquent, je ne mettrais pas de variables d’environnement dans bashrc, car cela va non seulement à l’encontre des conventions courantes, mais vous manquerez également de vos variables bashrc lors de l’appel d’un terminal à partir d’un environnement graphique de bureau.

Sur Redhat dans le /etc/profilej'ai trouvé ce commentaire:

"Les alias et les fonctions à l’échelle du système doivent aller dans / etc / bashrc. Les variables d’environnement personnel et les programmes de démarrage doivent aller dans ~ / .bash_profile. Les alias et fonctions personnels doivent aller dans ~ / .bashrc."

Par conséquent, si vous souhaitez définir des variables d'environnement utilisateur par utilisateur, faites-le dans le fichier .bash_profile de l'utilisateur.

En .bash_profileme dirigeant vers le je lis:

"Variables d’environnement personnel et programmes de démarrage.

Les alias personnels et les fonctions doivent aller dans ~ / .bashrc. Les variables d'environnement et les programmes de démarrage du système sont dans / etc / profile. Les alias et les fonctions à l’échelle du système se trouvent dans / etc / bashrc. "

Conclusion
Si vous voulez que seul root voie les programmes, par exemple, dans / sbinI, ajoutez ce chemin au .bash_profilefichier de root . Mais si vous voulez que chaque utilisateur de voir quels programmes sont installés sur la racine de votre boîte , je mettrais /sbinen /etc/.profile. Désormais, chaque utilisateur peut utiliser la complétion de tabulation pour rechercher des programmes spécifiques à la racine et, le cas échéant, élever les droits.

Cas particulier: SSH
Lorsque ssh est démarré avec une ligne de commande, un shell de connexion interactif est démarré. Mais dans ce cas, /etc/profilen'est pas lu. Lorsque j'ai défini les variables d'environnement dans le .bash_profilefichier de chaque utilisateur, cela fonctionnait avec ssh.

Meshfields
la source
2

DÉSOLÉ a mal interprété la question la réponse suivante est pour le profil d’un utilisateur, le laissant au cas où cela aiderait quelqu'un

modifier .bash_profile

nano ~/.bash_profile

puis quelque part dans le fichier, ajoutez / modifiez vos chemins séparés par:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

puis rechargez votre profil

source ~/.bash_profile

ou vous déconnecter et vous reconnecter

si vous cochez la case PATH, il devrait inclure les chemins récemment ajoutés

echo $PATH
GiorgosK
la source
1

Vous pouvez définir des variables d'environnement dans un fichier .rc; pour les shells bash (le plus courant, je crois, et par défaut dans CentOS), chaque utilisateur a un fichier nommé .bashrc dans son répertoire personnel.

Ajoutez la commande PATH = / usr / lib / ruby-enterprise / bin: $ PATH à ce fichier pour le définir pour un utilisateur particulier.

Pour le définir pour tous les utilisateurs (comme vous l'avez mentionné), modifiez-le dans / etc / bashrc (le fichier .bashrc par défaut dans le répertoire de base de chaque utilisateur doit générer ce fichier, mais vous devez le cocher deux fois).


la source