The difference between “echo $PATH” and /etc/paths

osxpath

When I echo $PATH I get this: Users/myusername/.node_modules_global/bin:/Users/mac/.node_modules_global/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/mac/Library/Android/sdk/platform-tools:/platform-tools.

I want to remove some paths from this, but when I open the file using the command vim /etc/paths, I get the following results:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Is the file /etc/paths different from the $PATH variable?

Best Answer

/etc/paths is part of what's used to set up $PATH for shell processes. When you open a new Terminal window, it starts bash, which runs several startup scripts: /etc/profile AND ~/.bash_profile OR (if that doesn't exist) ~/.bash_login OR (if that doesn't exist either) ~/.profile. These scripts set up the shell environment, including $PATH.

One of the things /etc/profile does is run /usr/libexec/path_helper, which reads /etc/paths and any files in /etc/paths.d, and adds their contents to $PATH. But this is just a starting point; your own startup script (if any exist) can add to $PATH, edit it, replace it completely, etc.

It looks to me like your startup script (and/or things it runs) is adding a number of entries to the basic set it gets from /etc/paths. "Users/myusername/.node_modules_global/bin:/Users/mac/.node_modules_global/bin:" is added to the beginning of $PATH (meaning those directories will be searched first), and ":/Users/mac/Library/Android/sdk/platform-tools:/platform-tools" is added at the end. If you want to know exactly what's adding them, you need to look at your startup script.

BTW, this process for setting up $PATH only applies to bash "login" shells. Anything run by a bash shell will inherit $PATH from it, so probably have essentially the same thing. bash non-login shells follow a somewhat different setup process. Other shells, and things not started from a shell at all (e.g. cron jobs) may have completely different $PATHs.

Related Question