PATH is getting set somewhere other than launchd.c

2019-03-31 19:16发布

问题:

The question of how to set PATH for all programs in a user session (not just Terminal) has come and been addressed. So I changed both /etc/launchd.conf AND /etc/paths, just to make sure everything was ok. However, I am still getting a different PATH envar when I launch Terminal than what I'm expecting (I'm not at all sure how to test PATH from another application.)

Here's what's in /etc/launchd.conf:

setenv PATH /sw/bin:/sw/sbin:/sw/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11/bin:/opt/local/bin:/opt/local/sbin

Here's what's in /etc/paths:

.
$HOME/bin
/sw/bin
/sw/sbin
/sw/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Plus a couple of files in /etc/paths.d/:

X11:

/usr/X11/bin

opt:

/opt/local/bin
/opt/local/sbin

Now, what I get when I launch a fresh Terminal is:

miishka:~ tamara$ echo $PATH
 /usr/bin:/bin:/usr/sbin:/sbin:.:/Users/tamara/bin:/sw/bin:/sw/sbin:/sw/local/bin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/opt/local/sbin
miishka:~ tamara$ 

I've checked my .bashrc and .bash_profile, I have no .profile, and I've checked /etc/profile and /etc/bashrc and NONE of them touch the PATH envar.

I'm so stumped.

回答1:

man path_helper

This thing drove me crazy. I use zsh, and in /etc/zshenv i found it.

# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

path_helper(8) actually has a useful purpose, I think. It's negated by the usual ultra vague sysadmin info from apple. look for path_helper(8) in your shell init file, in /etc, even if you are using macports, like I am. That might help.

Otherwise, you can try setting environment in:

 /etc/launchd.conf

But of course, the man page is not definitive. http://developer.apple.com is excellent documentation, but usually I want better man pages, not precise memory locations.

Finally, you can set them on on the loginwindow which reads:

 ~/.MacOSX/environment.plist

Now, to me, it seems odd to have several ways to do this, but... well hell, it is odd. They made a decent init replacement, it is to be the one process to rule them all, but nope, many jobs get run outside of it. Good luck. You should be able to get a $VAR into your gui using one of these methods.

Ah, http://developer.apple.com/library/mac/#qa/qa1067/_index.html.

OSX has various sessions and domains. To be precise, from

 man launchctl

Sessions:

Currently known session types include: Aqua, LoginWindow, Background, StandardIO and System.

Domains:

Look for plist(5) files ending in *.plist in the domain given. Valid domains include "system," "local," "network" and "all."

It makes sense when you read it.

Ugh. launchd always gets to me.

EDIT: https://serverfault.com/questions/16355/how-to-set-global-path-on-os-x/277034#277034

Again alleges that /etc/launchd.conf is where files get the path.

So I ran

 opensnoop -g -c -f /etc/launchd.conf

and opened Terminal, iterm, safari, keychain... nada. none of them opened that file.

EDIT: However, after watching the google video on launchd i ran

 launchctl export 

which showed me

PATH="/usr/bin:/bin:/usr/sbin:/sbin"; export PATH;
TMPDIR="/var/folders/YH/YHFe3+5RHmuxft5hr1XZTk+++TI/-Tmp-/"; export TMPDIR;
SHELL="/opt/local/bin/zsh"; export SHELL;
HOME="/Users/kb"; export HOME;
USER="kb"; export USER;
LOGNAME="kb"; export LOGNAME;
DISPLAY="/tmp/launch-dcQkBh/org.x:0"; export DISPLAY;
SSH_AUTH_SOCK="/tmp/launch-czhyqj/Listeners"; export SSH_AUTH_SOCK;
Apple_PubSub_Socket_Render="/tmp/launch-TI7lbI/Render"; export Apple_PubSub_Socket_Render;



sudo launchctl export 

which changes my context to the System context, instead of my Aqua context as a user, returned

PATH="/usr/bin:/bin:/usr/sbin:/sbin"; export PATH;

So the context really does matter, in other words, as does the session a command is run in.

Documentation for this tool, this init replacement, the most important daemon in apple, the one daemon to rule them all, is piss poor. Piss. Poor.