Where to place $PATH variable assertions in zsh?
macos, shell, zsh
Solution
tl;dr version: use `~/.zshrc`
And read the man page to understand the differences between:
`~/.zshrc`, `~/.zshenv` and `~/.zprofile`.
Regarding my comment
In my comment attached to the answer kev gave, I said:
This seems to be incorrect - /etc/profile isn't listed in any zsh documentation I can find.
This turns out to be partially incorrect: `/etc/profile` may be sourced by `zsh`. However, this only occurs if `zsh` is "invoked as `sh` or `ksh`"; in these compatibility modes:
The usual zsh startup/shutdown scripts are not executed. Login shells source /etc/profile followed by $HOME/.profile. If the ENV environment variable is set on invocation, $ENV is sourced after the profile scripts. The value of ENV is subjected to parameter expansion, command substitution, and arithmetic expansion before being interpreted as a pathname. [man zshall, "Compatibility"].
The ArchWiki ZSH link says:
At login, Zsh sources the following files in this order: /etc/profile This file is sourced by all Bourne-compatible shells upon login
This implys that `/etc/profile` is always read by `zsh` at login - I haven't got any experience with the Arch Linux project; the wiki may be correct for that distribution, but it is not generally correct. The information is incorrect compared to the zsh manual pages, and doesn't seem to apply to zsh on OS X (paths in `$PATH` set in `/etc/profile` do not make it to my zsh sessions).
To address the question:
where exactly should I be placing my rvm, python, node etc additions to my $PATH?
Generally, I would export my `$PATH` from `~/.zshrc`, but it's worth having a read of the zshall man page, specifically the "STARTUP/SHUTDOWN FILES" section - `~/.zshrc` is read for interactive shells, which may or may not suit your needs - if you want the `$PATH` for every `zsh` shell invoked by you (both `interactive` and not, both `login` and not, etc), then `~/.zshenv` is a better option.
Is there a specific file I should be using (i.e. .zshenv which does not currently exist in my installation), one of the ones I am currently using, or does it even matter?
There's a bunch of files read on startup (check the linked `man` pages), and there's a reason for that - each file has it's particular place (settings for every user, settings for user-specific, settings for login shells, settings for every shell, etc). Don't worry about `~/.zshenv` not existing - if you need it, make it, and it will be read.
`.bashrc` and `.bash_profile` are not read by `zsh`, unless you explicitly source them from `~/.zshrc` or similar; the syntax between `bash` and `zsh` is not always compatible. Both `.bashrc` and `.bash_profile` are designed for `bash` settings, not `zsh` settings.
Problem
I love `zsh`, but I am not sure where to place my `$PATH` and other variable assertions? I find that they are scattered between the files `.zshrc` `.zprofile` `.bashrc` `.bash_profile`, and sometimes doubled. I realize that having anything inside the `bash` files doesn't make much sense seeing as I'm using `zsh`, but where exactly should I be placing my `rvm`, `python`, `node` etc additions to my `$PATH`? Is there a specific file I should be using (i.e. `.zshenv` which does not currently exist in my installation), one of the ones I am currently using, or does it even matter?