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
  • 70,465
  • Comments are not for extended discussion; this conversation has been moved to chat. – Thomas Ward May 14 '18 at 02:02
  • @Zanna your solution worked out perfectly. Systemd didn't work for PATH, only for MANPATH and INFOPATH. Going back to your answer, I wanted to ask one or two questions: I don't have /etc/bash.bashrc instead I have /etc/bashrc, my ~/.bashrc is sourcing /etc/bashrc but this system wide file has a conditional statement with PS1 which it uses to check if it is an interactive shell. I checked output of env and I don't see PS1 but if I echo $PS1 then I get [\u@\h \W]\$. Is it safe to remove the code from ~/.bashrc that sources /etc/bashrc? – bit Jun 11 '18 at 09:34
  • @MyWrathAcademia PS1 isn't an environment variable. In Ubuntu, ~/.bashrc should not source /etc/bash.bashrc which is read first. I don't know what should happen on your system :/ – Zanna Jun 11 '18 at 10:06
  • @Zanna I have a question about how you quoted the variables MANPATH and INFOPATH. Is it not better to add the path to these variables by appending the path with a colon to the path list (i.e. $MANPATH or $INFOPATH) because if you wanted to add a new path to MANPATH like this MANPATH="usr/local/texlive/2019/texmf-dist/doc/man:$MANPATH" then if you echo $MANPATH you would get usr/local/texlive/2019/texmf-dist/doc/man::usr/local/texlive/2018/texmf-dist/doc/man. May be this can be added as a warning if true. – bit Jul 04 '18 at 20:28
  • @MyWrathAcademia as far as I know, the colon has to come first to make sure the dynamic lookup happens. I don't actually know how this works because I have no idea how or where the behaviour is defined, but it's not the same as PATH. AFAIK, the first colon won't be literal and to add on you should do something like MANPATH=":/some/path:$MANPATH" – Zanna Jul 04 '18 at 21:45
  • @Zanna I have a related question about PATH's that I want to ask. I'm not sure whether I can do it here or if I have to open a new question. Can you confirm this? – bit Jul 14 '18 at 09:06
  • Please ask a new question on [unix.se] @MyWrathAcademia :) – Zanna Jul 14 '18 at 10:07