Coder Perfect

In ZSH, adding a new entry to the PATH variable.

Problem

I’m using zsh and I’m trying to add a new entry to the PATH variable (/home/david/pear/bin), but I’m not sure how.

The thing that confuses me the most is that there’s not a single reference to a PATH variable in my ~/.zshrc file, but doing echo $PATH returns:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

So, somehow, a PATH variable is set.

Asked by David Barreto

Solution #1

In fact, ZSH allows you to employ unique mappings of environment variables. So here’s what you can do:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

That, in my opinion, is a really useful feature that may be applied to other variables. Example:

typeset -T LD_LIBRARY_PATH ld_library_path :

Answered by ony

Solution #2

Add the following line to.zshrc:

export PATH=/home/david/pear/bin:$PATH

EDIT: While this works, ony’s response is preferable because it makes use of the structured interface ZSH provides for variables like $PATH. This is a conventional bash technique, but as far as I’m aware, there’s no reason to use it when ZSH has better choices.

Answered by Linuxios

Solution #3

You can add to your PATH in a simple manner. Unless you’re appending multiple elements, there’s no need for parenthesis. It also frequently does not necessitate the use of quotation marks. So here’s a quick and easy way to append:

path+=/some/new/bin/dir

This lower-case syntax treats path as an array, but it also has an impact on its upper-case counterpart, PATH (to which it is “bound” via typeset).

(Notice that the separator no: is required/desired.)

Then the standard pattern for evaluating a new script/executable is as follows:

path+=$PWD/.
# or
path+=$PWD/bin

You can scatter path settings throughout your.zshrc (as seen above), and the earlier listed settings will take precedence (though you may wish to use the “prepend” form path=(/some/new/bin/dir $path) on occasion).

Treating path in this manner (as an array) also eliminates the requirement for a rehash to locate newly pathed instructions.

Also take a look at vared path as a dynamic way to edit path (and other things).

For this query, you may simply be interested in path, but since we’re talking about exports and arrays, keep in mind that arrays cannot be exported in general.

You can even prevent duplicate entries from being added to PATH (see this and this):

typeset -U path

Your system shell files set your path for you, which is why it already has some entries in it. This has been discussed in a couple of previous posts:

Answered by Micah Elliott

Solution #4

a single liner with no opening file /.zshrc

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

or

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Do source /.zshrc in the same tab or a new tab to see the result.

Answered by Siva Praveen

Solution #5

Answered by saneryee

Post is based on https://stackoverflow.com/questions/11530090/adding-a-new-entry-to-the-path-variable-in-zsh