5

I installed texlive and I want to add it as an environment variable to my Path so that Emacs AucTeX can read it when I start emacs from the GUI or from the command line. So far I've read that emacs only reads files from ~/.profile.

Therefore my plan is to add texlive to my path in .profile to enable emacs GUI to read it and then source ~/profile from .bashrc in order for emacs that is started inside my non-login interactive GNOME terminal to see the path.

Note: I do not have a .profile file in my home directory, only in my /etc directory, and I'd rather not touch that one, but I have a .bash_profile in my home directory. However I read that .bash_profile is only run for an interactive login session aka console mode which I don't use.

My plan is to create a .profile file in my home directory and do the following:

step 1: Create ~/.profile

Step 2: Add texlive environment variable to path in .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

Step 3: Source .profile from .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

I know that there is a lot of apprehension towards sourcing .profile from .bashrc due to the risk of causing an infinte loop. However since I am creating a .profile file from scratch this will not be a problem as it will not contain any code that references .bashrc.

My Questions:

  1. What do you think of my plan?
  2. Do you think it will work?
  3. Do you have any suggestions on how to improve it or perhaps other alternatives

Additional info: My .bashrc only contains code that sources ~/etc/bashrc and one environment variable that was automatically added by Anaconda: export PATH="/home/Fedora_User/Anaconda3/bin:$PATH"

Keep in mind that I know gnome-terminal can be run as an interactive login shell but I have never done this and don't know if it will impact the performance of my terminal sessions.

bit
  • 175

1 Answers1

4

Firstly, note that if you want ~/.profile to be read, you'll need to remove ~/.bash_profile, otherwise ~/.profile will be ignored by Bash.

You are actually overcomplicating this a bit. PATH is set in /etc/environment. It is always exported already, so it does not need to be exported again.

If you make changes to your PATH in ~/.profile they will be inherited by every shell, whether it is a login shell, interactive or otherwise.

Other variables exported in ~/.profile will also be passed into the environment, and will be available in every shell. ~/.profile is read once when you log in to your session, and exported variables stay exported.

Sourcing ~/.profile in ~/.bashrc is a bad idea. ~/.profile sources ~/.bashrc so you will get an infinite loop. Even if ~/.profile does not source ~/.bashrc it is a bad idea to have ~/.bashrc source ~/.profile or any other file with assignments like

PATH=$PATH:/some/other/place

because every time an interactive shell starts another interactive shell the PATH will get extended... you'll end up with your PATH being

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

etc.

Your MANPATH assignment does not need to include $MANPATH but it should start with a leading colon. Please see this question and its answer. By default MANPATH is unset and the correct path is dynamically determined (in some way I don't understand), so including the existing MANPATH does nothing. You may need to start the MANPATH assignment with a colon to avoid preventing the path being determined dynamically. As far as I know, the same goes for INFOPATH

Therefore, I suggest:

Rename ~/.bash_profile ~/.profile

Add the lines:

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 that I have appended to the PATH rather than prepending. You can prepend (put $PATH at the end instead of the beginning) if you want to. The first executable found in path lookup is run, so if two programs in different PATH locations have the same name, the one in the directory that comes first (further to the left) in PATH will be run.

Do not add anything to your ~/.bashrc. Environment variables modified, or new variables exported in ~/.profile will be available to every shell and don't need to be additionally set elsewhere.

Also note that you should not source /etc/bash.bashrc in ~/.bashrc, because /etc/bash.bashrc is already sourced by every interactive shell first*, and we use ~/.bashrc to make subsequent adjustments.

*An exception - /etc/bash/bashrc checks that the shell is interactive using an unreliable method - it checks that PS1 is set. If you start a shell unsetting PS1, /etc/bash.bashrc will not be sourced, even though the shell is interactive. Another exception is when the shell is started with --norc, but that's more obvious.

Zanna
  • 72,312