all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Bob Proulx <bob@proulx.com>
To: Larry Evans <cppljevans@suddenlink.net>
Cc: help-gnu-emacs@gnu.org
Subject: Re: emacs doesn't inherit PATH from environment
Date: Wed, 14 Feb 2018 19:38:42 -0700	[thread overview]
Message-ID: <20180214190011968486164@bob.proulx.com> (raw)
In-Reply-To: <p62ig5$j9h$1@blaine.gmane.org>

Larry Evans wrote:
> I understand, and after changing ; to : in ~/.emacs.d/init.common.el
> it worked; however, the point I was making is the setting of PATH
> in ~/.emacs.d/init.common.el shouldn't be needed.

I agree.  Why are doing it?  :-)

> Indeed, the setenv in ~/.emacs.d/init.common.el was deleted, but I
> also moved the 'export PATH' from ~/.bashrc to ~/.profile. After
> that, the Makefile worked.

Sounds good.  In my world view the best and only place to set PATH is
in the .profile and not elsewhere.

So glad to hear from you that things are working in the normal
configuration.  That's great.

> The conclusion I reached was that somehow emacs, when invoked from
> my windows interface, apparently just runs the ~/.profile code but
> not the ~./bashrc code and that's why emacs was not seeing the PATH
> (because, previously it was set in ~/.bashrc).

I have no idea about MS-Windows but in the Unix/GNU universe the
environment used to be simple.  In the simple days when logging in the
shell would look at it's own name and see that it started with a "-"
such as "-bash" and know that it was being communicated to by
/bin/login that it was a login shell and should source the login
environment files as a login shell should do.  That means ~/.profile
for Bourne derived shells.  (And there is no need to discuss csh
derived shells, becuase it is csh and no one should be using it
anymore.  Regardless that I know many are still using it.)

Then in the .profile a bash user would then detect that they are
running bash and if so then source the ~/.bashrc file explicitly.  If
it is not done explicitly then it is not done at all.  You are in
control.  However I can't think of a reason not to source it there.

if [ -n "$BASH_VERSION" ]; then
  . "$HOME/.bashrc"
fi

And of course a bash only user might decide to use ~/.bash_profile
instead.  If so then of course only bash reads that file and so no
test to check for running bash is needed and one can simply source the
~/.bashrc file unconditionally.  In a ~/.bash_profile file:

  . "$HOME/.bashrc"

Note that if you have a .bash_profile then it *overrides* any further
bash use of ~/.profile.  Which can frustrate you terribly if 'rvm'
decided to create it for you and you didn't realize it did that and
are trying to figure out where things went wrong.  I hate rvm for this
reason.  It makes bad assumptions and breaks things.  But I digress.

Personally I still use a ~/.profile and keep it generic.  Because that
allows me to switch around and use ksh and zsh and still get a sane
environment shared among all of them.  I put PATH only in .profile and
use ~/.bashrc for bash specific settings such as HISTCONTROL and PS1
and "shopt -s checkwinsize" and so forth.  Or by environment variables
that I might want to change from one shell invocation to the next.

This is why ~/.profile is the natural place for PATH.  So that even if
one switches shells that PATH will still be set as desired.  Since
PATH is not a shell specific item.

However, and this is a big *HOWEVER*, along came Desktop Environments
such as GNOME, KDE, LXDE, XFCE, and others running an "xdm" or X
Display Manager such as lightdm and others.  For some reason
unfathomable to me they decided not to set up the originating shell as
a login shell!  That is really a shock to me.  And one that has caused
problems for literally decades.

Instead it is distribution defined behavior what happens when an xdm
such as lightdm starts.  It might do one thing or it might do another
thing but you can count on it NOT sourcing your ~/.profile!  Instead
most distributions will cause it to source a ~/.xsessionrc file.  On
my Debian system that is sourced from the /etc/X11/Xsession script by
the /bin/sh shell and therefore cannot contain any bash specific
features.  It should contain only portable shell constructs.  Setting
PATH and other variables is okay.

IMNHO the only sane thing to do in the ~/.xsessionrc file is to source
the $HOME/.profile file.  They are both portable shell syntax files.
Then put all of your environment setting in ~/.profile the same as
always.  Otherwise one ends up with some things set one way when
logging in with ssh and some things set another way when logging in
with a graphical login manager.  In ~/.xsessionrc file:

  . "$HOME/.profile"

[[There is also the ~/.xsession script.  I used to use and recommend
that way for years.  But I have been convinced by others that it is
better to recommend the ~/.xsessionrc file instead.  It is less for
people to understand using that file.]]

That covers almost everything.  Unfortunately there is the traditional
'rsh' implemented by the current 'ssh' and shell environment.  It's
yet again a few special cases.  But not relevant here so skipping
discussing it.

I realize that all of this might be foreign concepts to an MS-Windows
user.  But that is why I wrote it.  So that it would become more
familiar and hopefully help people understand how things work.  And
perhaps people using Unix/GNU might enjoy reading it too. :-)

Bob



  reply	other threads:[~2018-02-15  2:38 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-12 15:51 emacs doesn't inherit PATH from environment Larry Evans
2018-02-14  1:27 ` Glenn Morris
2018-02-14  2:24   ` Larry Evans
2018-02-14 14:53     ` Larry Evans
2018-02-14 23:18       ` Robert Thorpe
2018-02-15  1:03         ` Larry Evans
2018-02-15  2:38           ` Bob Proulx [this message]
     [not found]           ` <mailman.9140.1518662330.27995.help-gnu-emacs@gnu.org>
2018-02-15 15:59             ` Barry Fishman
2018-02-15 20:18               ` Bob Proulx
     [not found]         ` <mailman.9127.1518652911.27995.help-gnu-emacs@gnu.org>
2018-02-16 16:58           ` Emanuel Berg
     [not found]     ` <mailman.9096.1518616283.27995.help-gnu-emacs@gnu.org>
2018-02-16 16:54       ` Emanuel Berg
     [not found] ` <mailman.9075.1518571658.27995.help-gnu-emacs@gnu.org>
2018-02-14  1:38   ` Emanuel Berg
     [not found] <mailman.8985.1518453550.27995.help-gnu-emacs@gnu.org>
2018-02-13 19:12 ` Emanuel Berg
2018-02-13 23:57   ` Larry Evans
     [not found]   ` <mailman.9069.1518566292.27995.help-gnu-emacs@gnu.org>
2018-02-14  0:11     ` Emanuel Berg
2018-02-14  0:48       ` Larry Evans
2018-02-14  1:45         ` Robert Thorpe
2018-02-14  2:35           ` Larry Evans
     [not found]       ` <mailman.9071.1518569365.27995.help-gnu-emacs@gnu.org>
2018-02-14  1:23         ` Emanuel Berg
2018-02-14  1:25         ` Emanuel Berg
2018-02-14  1:32   ` Robert Thorpe
2018-02-14 19:19   ` Bastian Beischer
     [not found]   ` <mailman.9115.1518635972.27995.help-gnu-emacs@gnu.org>
2018-02-16 17:14     ` Emanuel Berg
     [not found] <mailman.9076.1518571984.27995.help-gnu-emacs@gnu.org>
2018-02-14  1:43 ` Emanuel Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180214190011968486164@bob.proulx.com \
    --to=bob@proulx.com \
    --cc=cppljevans@suddenlink.net \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.