web-dev-qa-db-fra.com

Comment puis-je définir le chemin afin qu'il puisse être lu à partir de l'interface graphique et en ligne de commande par le même programme?

J'ai installé texlive et je souhaite l'ajouter en tant que variable d'environnement à mon chemin afin qu'Emacs AucTeX puisse le lire lorsque je lance emacs à partir de l'interface graphique ou de la ligne de commande. Jusqu'à présent, j'ai lu qu'Emacs ne lit que les fichiers de ~/.profile.

Par conséquent, mon plan est d’ajouter texlive à mon chemin dans .profile pour permettre à l’interface graphique d’emacs de le lire, puis de source ~/profile à partir de .bashrc afin de lancer emacs à l’intérieur de mon interaction non-login. Terminal GNOME pour voir le chemin.

Remarque: je n'ai pas de fichier .profile dans mon répertoire personnel, mais uniquement dans mon répertoire /etc, et je préférerais ne pas le toucher, mais j'ai un .bash_profile dans mon répertoire personnel. annuaire. Cependant, j'ai lu que .bash_profile n'est exécuté que pour une session de connexion interactive, également appelée mode console, que je n'utilise pas.

Mon plan est de créer un fichier .profile dans mon répertoire personnel et de procéder comme suit:

étape 1: Créer ~/.profile

Étape 2: Ajouter la variable d’environnement texlive au chemin dans .profile

export PATH=/usr/local/texlive/2018/bin/x86_64-linux:$PATH
export MANPATH=/usr/local/texlive/2018/texmf-dist/doc/man:$MANPATH
export INFOPATH=/usr/local/texlive/2018/texmf-dist/doc/info:$INFOPATH

Étape 3: Source .profile à partir de .bashrc

#Adding this at the bottom or start of .bashrc to source .profile when the terminal is opened.

if [-s ~/.profile]; then;
    source ~/.profile;
fi

Je sais qu'il y a beaucoup d'appréhension à l'égard de la recherche de sources .profile de .bashrc en raison du risque de provoquer une boucle infinte. Cependant, étant donné que je crée un fichier .profile à partir de zéro, cela ne posera pas de problème car il ne contiendra aucun code faisant référence à .bashrc.

Mes questions:

  1. Que penses-tu de mon plan?
  2. Pensez-vous que cela va fonctionner?
  3. Avez-vous des suggestions sur la façon de l'améliorer ou peut-être d'autres alternatives

Informations supplémentaires: Mon .bashrc ne contient que du code source ~/etc/bashrc et une variable d'environnement ajoutée automatiquement par Anaconda: export PATH="/home/Fedora_User/Anaconda3/bin:$PATH"

N'oubliez pas que je sais que gnome-terminal peut être utilisé en tant que shell de connexion interactif, mais je ne l'ai jamais fait et je ne sais pas si cela affectera les performances de mes sessions de terminal.

2
MyWrathAcademia

Tout d'abord, notez que si vous voulez que ~/.profile soit lu, vous devrez supprimer ~/.bash_profile, sinon ~/.profile sera ignoré par Bash.

En fait, vous compliquez un peu la tâche. PATH est défini dans /etc/environment. Il est toujours déjà exported, il n’a donc pas besoin d’être exporté à nouveau.

Si vous apportez des modifications à votre PATH dans ~/.profile, chaque shell en héritera, qu'il s'agisse d'un shell de connexion, interactif ou autre.

D'autres variables exportées dans ~/.profile seront également transmises à l'environnement et seront disponibles dans chaque shell. ~/.profile est lu une fois lorsque vous vous connectez à votre session et les variables exportées restent exportées.

Sourcing ~/.profile dans ~/.bashrc est une mauvaise idée. ~/.profile sources ~/.bashrc donc vous obtiendrez une boucle infinie. Même si ~/.profile ne source pas ~/.bashrc c'est une mauvaise idée d'avoir ~/.bashrc source ~/.profile ou tout autre fichier avec des affectations telles que

PATH=$PATH:/some/other/place

parce que chaque fois qu'un shell interactif démarre un autre shell interactif, PATH sera étendu ... vous obtiendrez votre PATH

/original/path:/some/other/place:/some/other/place:/some/other/place

etc.

Votre affectation MANPATH n'a pas besoin d'inclure $MANPATH mais elle doit commencer par un signe deux-points. S'il vous plaît voir cette question et sa réponse . Par défaut, MANPATH n'est pas défini et le chemin correct est déterminé dynamiquement (d'une certaine manière, je ne le comprends pas), donc inclure MANPATH existant ne fait rien. Vous devrez peut-être commencer l'affectation MANPATH avec un signe deux-points pour éviter que le chemin ne soit déterminé de manière dynamique. Autant que je sache, il en va de même pour INFOPATH

Par conséquent, je suggère:

Renommer ~/.bash_profile~/.profile

Ajouter les lignes:

PATH="$PATH:/usr/local/texlive/2018/bin/x86_64-linux"
export MANPATH=":/usr/local/texlive/2018/texmf-dist/doc/man"
export INFOPATH=":/usr/local/texlive/2018/texmf-dist/doc/info"

Notes que j'ai ajoutées à PATH plutôt que de les ajouter au début. Vous pouvez ajouter du préfixe (mettez $PATH à la fin au lieu du début) si vous le souhaitez. Le premier exécutable trouvé dans la recherche de chemin est exécuté. Ainsi, si deux programmes situés dans des emplacements PATH différents portent le même nom, celui du répertoire qui arrive en premier (plus à gauche) dans PATH sera exécuté.

N'ajoutez rien à votre ~/.bashrc. Les variables d'environnement modifiées ou les nouvelles variables exportées dans ~/.profile seront disponibles pour tous les Shell et il n'est pas nécessaire de les définir ailleurs.

Notez également que vous ne devez pas source /etc/bash.bashrc dans ~/.bashrc, car /etc/bash.bashrc est déjà généré par chaque shell interactif en premier * et nous utilisons ~/.bashrc pour apporter les modifications suivantes.

* Une exception - /etc/bash/bashrc vérifie que le shell est interactif à l'aide d'une méthode non fiable. Il vérifie que PS1 est défini. Si vous démarrez un shell en désactivant PS1, /etc/bash.bashrc ne sera pas créé, même si le shell est interactif. Une autre exception concerne le démarrage du shell avec --norc, mais c'est plus évident.

3
Zanna