18

I am using MacVim (basically gvim for the mac).

If I open macvim from the command line then my $PATH variable will be properly set.

If I open macvim via point and click with the finder, the $PATH variable will NOT be properly set.

Can anyone give me some insight?

Note: I know at least part of my path is set in ~/.bashrc, but I am not sure where the rest of it is set.


Examples:

If I open macvim from the terminal:

% gvim basic.tex 

And then in MacVim I go:

:!echo $PATH
/opt/local/bin:/opt/local/sbin:/sw/bin:/sw/sbin:/Applications/MacVim.app/Contents/M
acOS:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/texbin:/usr/X11R6/bin 

This is the right path.


When I open the file with the mouse (in finder)

When I go:

:!echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin  

It gives me a little path. Why?

sixtyfootersdude
  • 25,859
  • 43
  • 145
  • 213

4 Answers4

16

I had this same issue but it only appeared after setting my default shell to zsh like so

export SHELL=/bin/zsh

It seems that there is a bug in the OS X zsh setup. The work around in brief is to merge /etc/zshenv into /etc/zprofile. In my case I didn't have a /etc/zprofile so just moving over the file did the trick:

sudo mv /etc/zshenv /etc/zprofile

This post describes the solution in more detail.

Tim Clem
  • 1,260
  • 1
  • 11
  • 12
  • 6
    This is the solution mentioned on the official MacVim github wiki: https://github.com/b4winckler/macvim/wiki/Troubleshooting (under the "For zsh users" heading) – Nate K Mar 14 '12 at 01:41
  • 1
    I think maybe the key is getting the eval /usr/libexec/path_helper -s command out of `/etc/zshenv`. I find the word "merge" in the answer confusing. Still, very helpful, Thx. Upvote! – Chad Skeeters Jul 13 '13 at 16:32
  • 1
    Instead of using the system `/etc/zprofile` you can use your own `~/.zprofile` – a paid nerd May 09 '14 at 20:29
  • in my case I just moved all my export PATH things from ~/.zshrc into ~/.zprofile the doc says to copy them and do a typeset but there is no need – slf Jul 29 '14 at 18:50
  • 2
    The only thing that worked for me was `ln -s ~/.zshrc ~/.zprofile` – BenjaminRH Dec 03 '14 at 12:21
  • Since the question mentioned the user's `~/.bashrc` file, this answer about zsh doesn't seem very helpful. – Mr. Lance E Sloan Jun 28 '17 at 15:37
  • is it bad if I put this answers code in `zprofile` and change `bashrc` to `zshrc`? it seems to work... but im not sure if this is wrong. I want the path to update dynamically https://stackoverflow.com/a/3345345/794481 – Tallboy Aug 07 '19 at 01:24
10

For me, simply creating a new symbolic link from .zprofile to .zshrc did the trick:

ln -s ~/.zshrc ~/.zprofile
Thomas Hunter II
  • 5,081
  • 7
  • 35
  • 54
adampasz
  • 1,065
  • 9
  • 10
8

The place to set environment variables on the Mac for GUI applications (those started via loginwindow, the Finder, etc.) is ~/.MacOSX/environment.plist

Alternately in MacVim you can choose to launch vim processes in a login-shell (look in the preferences).

For more info see this post.

sixtyfootersdude
  • 25,859
  • 43
  • 145
  • 213
3

The difference in the PATHs probably has something to do with the difference between a login shell (logging in) and a non-login shell (bringing up a console).

From the bash man page:

When bash is invoked as an interactive login shell ... it looks for ~/.bash_profile...

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc...

What I did to get around this issue was to add the following code to my ~/.bash_profile, telling it to source my ~/.bashrc if it exists:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Community
  • 1
  • 1
Curt Nelson
  • 3,132
  • 19
  • 13
  • 1
    Won't this result in bashrc being loaded twice when it is an interactive shell? – sixtyfootersdude Jul 27 '10 at 17:25
  • 1
    I don't believe that it will get loaded twice. Now that I think about it, this isn't a solution to your problem... This solves the issue where you're logging in remotely (e.g. via ssh) and your `~/.bashrc` doesn't get loaded. You're not remotely logging in. – Curt Nelson Jul 27 '10 at 19:53
  • 1
    But when you open a terminal *normally*, it will load your `.bash_profile` then it will load your `.bashrc` (maybe opposite order). What you are doing will make it; `.bash_profile` which will load your `.bashrc` then it will load your `.bashrc`. Probably this doesn't matter but if you wanted to do a work around, you could have a var `$BASHRC_LOADED` in your `.bashrc` and enclose everything in `if(not($BASHRC_LOADED))`. *(sorry bad syntax)* – sixtyfootersdude Aug 02 '10 at 14:34
  • 2
    With the system I'm on now (Ubuntu 10.4) when I open a terminal it loads my `.bashrc` only. If I ssh into the same box, it loads my `.bash_profile`. I believe this is the way bash usually works. As a side note, for each user, Ubuntu sets up a `.profile` file (which gets loaded if `.bash_profile` doesn't exist) that sources your `.bashrc` if it exists, much like what I mentioned above. – Curt Nelson Aug 06 '10 at 01:04