Добавление новой записи в переменную PATH в ZSH

189

Я использую zsh и пытаюсь добавить новую запись ( /home/david/pear/bin) в PATHпеременную, но не знаю как.

Больше всего меня смущает то, что PATHв моем ~/.zshrcфайле нет ни одной ссылки на переменную , а выполняется echo $PATHвозврат:

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

Таким образом, PATHпеременная где-то устанавливается.

Дэвид Баррето
источник

Ответы:

214

Здесь добавьте эту строку в .zshrc:

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

РЕДАКТИРОВАТЬ : Это работает, но только один ответ ниже, так как он использует преимущества структурированного интерфейса, который ZSH предоставляет для таких переменных, как $PATH. Этот подход является стандартным для bash, но, насколько мне известно, нет причин использовать его, когда ZSH предлагает лучшие альтернативы.

Linuxios
источник
29
хаха, забудь об этом, хотя я думал, что это была только консольная команда, но добавление этой строки в .zshrc помогло. Большое спасибо!
Дэвид Баррето
1
В моем .zshrc уже была строка для экспорта PATH, поэтому я заменил ее на измененную.
Зак Хьюстон
6
Я должен был удалить двойные кавычки вокруг записей, PATH="/home/david/pear/bin:/usr/bin:etc"чтобы PATH=/home/david/pear/bin:/usr/bin:etcон оставался в zshrc.
a7omiton
3
@taco, вы можете использовать $ HOME
mencargo
1
@DanielSpringer: Да. Когда вы открываете оболочку, она наследуется PATHот родительского процесса, который ее запустил, а затем, когда он запускается .zshrc( .bashrcили что-то еще), это то, что позволяет вам добавлять дополнительные вещи в этот путь.
Linuxios
224

На самом деле, использование ZSH позволяет использовать специальное отображение переменных среды. Так что вы можете просто сделать:

# 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

Для меня это очень полезная функция, которая может быть распространена на другие переменные. Пример:

typeset -T LD_LIBRARY_PATH ld_library_path :
оны
источник
16
Хороший ответ. В моем случае, ~/.zshrcпосле .profileи переписывает все в .profile. Я потянул за волосы, чтобы понять это.
Хан Нгуен,
1
Случай добавления не нуждается в паренсе, если вы не добавляете более одного элемента. Это также часто не нуждается в кавычках. Итак, простой, короткий способ добавить это
Мика Эллиотт
1
@SuperUberDuper, вы должны понимать, что почти любая оболочка Unix просто читает файлы запуска, что почти так же, как если бы вы вводили ее в оболочку в интерактивном режиме. Что касается файлов «радиоуправляемых» вы можете найти интересный ответ на этот вопрос
онах
6
Можно избежать явного экспорта с -xи оставить в переменной только уникальные значения -U, по умолчанию предполагается двоеточие, поэтому это может быть:typeset -TUx PATH path
Горе
2
@DanielSpringer, нет. Если вы хотите это в этих терминах, то: path=(...)(без ссылок $pathили $PATHвнутри) присваивает, добавляет path=(... $path)и path+(...)добавляет.
оны
40

Вы можете добавить к вашему сведению PATHв минимальной форме. Нет необходимости в скобках, если вы не добавляете более одного элемента. Это также обычно не нуждается в кавычках. Итак, простой, короткий способ добавить это:

path+=/some/new/bin/dir

Общее использование

Тогда общий шаблон для тестирования нового скрипта / исполняемого файла становится:

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

Этот синтаксис нижнего регистра использует pathв качестве массива , но также влияет на его эквивалент партнера в верхнем регистре PATH(с которым он «связан» через typeset).

(Обратите внимание, что в качестве разделителя не :требуется / не требуется .)

Связанные лакомые кусочки

Обработка pathэтого способа (как массива) также означает: не нужно делать a, rehash чтобы получить новые исправленные команды, которые будут найдены.

Также обратите внимание на vared pathдинамический способ редактированияpath и других вещей.

Вас может заинтересовать только pathэтот вопрос, но поскольку мы говорим об экспорте и массивах, обратите внимание, что массивы, как правило, не могут быть экспортированы.

Вы даже можете запретить PATHдублирование записей (см. Это и это ):

typeset -U path
Мика Эллиотт
источник
Разве это не должно быть 'path + =: / foo / bar'? (с двоеточием)
Эндрю Лориен
1
@andrewlorien Я обновил ответ подробностями о разделителе двоеточия.
Мика Эллиотт
Обратите внимание: если после пути есть комментарий, нам нужны кавычки, например path+='my/path' # for fun. Это очевидно, если у вас есть пробелы, но не так много, если у вас есть комментарии.
Франклин Ю
«(Обратите внимание, что нет: требуется / требуется в качестве разделителя.)« Это верно только для строчных букв path. Предыдущее :требуется для PATH, как следует в .zshrc PATH+=:/Users/path/to/my/folder
Эммет Р.
37

один лайнер, без открытия ~/.zshrcфайла

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

или

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

Чтобы увидеть эффект, сделайте source ~/.zshrcв той же вкладке или откройте новую вкладку

Шива Правин
источник
1
Отлично работал на OSX с оболочкой Zsh.
Stryker
1
Работал как шарм!
Акбар Ша Эбрахим
14
  1. Добавлен путь к ~ / .zshrc

    sudo vi ~/.zshrc

    добавить новый путь

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Обновление ~ / .zshrc

    Сохранить ~ / .zshrc

    source ~/.zshrc

  3. Проверьте ПУТЬ

    echo $PATH

saneryee
источник
2
Это Bashпуть.
Кузен Кокаин
13

ВАРИАНТ 1: Добавьте эту строку в ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

После этого вам нужно запустить, source ~/.zshrcчтобы ваши изменения вступили в силу ИЛИ закрыть это окно и открыть новое

ВАРИАНТ 2: выполнить его внутри консоли терминала, чтобы добавить этот путь только в текущий сеанс окна терминала. Когда вы закроете окно / сессию, оно будет потеряно.

Димитар
источник
Можете ли вы рассказать, чем этот ответ отличается от того же ответа, который был опубликован 5 лет назад ?
Франклин Ю
в этом ответе не сказано, что вы должны добавить эту строку кода в файл, если вы просто запустите ее так, что она изменится только в текущих окнах, и это не объясняется в исходном ответе
Димитар