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

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

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

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

Значит, где-то устанавливается переменная PATH.


person David Barreto    schedule 17.07.2012    source источник
comment
На мой взгляд, PATH следует манипулировать в .zshenv, а не в _2 _...   -  person Rmano    schedule 30.09.2020
comment
На случай, если кому-то еще будет интересно узнать об указателе @Rmano на использование '.zshenv' (как и я), вот ссылка подробное обсуждение.   -  person YCode    schedule 04.07.2021


Ответы (6)


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

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

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

person Linuxios    schedule 17.07.2012
comment
ха-ха, забудь, я думал, что это была всего лишь консольная команда, но добавление этой строки в .zshrc помогло. Большое спасибо! - person David Barreto; 18.07.2012
comment
В моем .zshrc уже была строка для экспорта PATH, поэтому я заменил ее модифицированной. - person Zack Huston; 27.02.2014
comment
Мне пришлось удалить двойные кавычки вокруг записей, то есть от PATH="/home/david/pear/bin:/usr/bin:etc" до PATH=/home/david/pear/bin:/usr/bin:etc, чтобы он оставался в zshrc. - person a7omiton; 07.02.2015
comment
@taco, вы можете использовать $ HOME - person mencargo; 10.11.2015
comment
Он сотрет весь старый PATH, попробуйте export PATH=$PATH:/path/to/dir - person sstruct; 19.01.2017
comment
Это добавляется к моему существующему PATH, и каждый раз, когда он запускается, добавляется снова. Как мне точно установить, какой должен быть PATH? - person Daniel Springer; 18.11.2019
comment
Вы можете установить PATH напрямую @DanielSpringer: export PATH=/some/where:/bin:/usr/bin и так далее. Вы об этом спрашиваете? Идея состоит в том, чтобы запускать код в этом ответе в .zshrc или .profile или что-то в этом роде в начале каждого сеанса. - person Linuxios; 18.11.2019
comment
@DanielSpringer: Да. Когда вы открываете оболочку, она наследует PATH от родительского процесса, который ее запустил, а затем, когда он запускается .zshrc (или .bashrc или что-то еще), это то, что позволяет вам добавлять дополнительные элементы в этот путь. - person Linuxios; 18.11.2019
comment
@DanielSpringer: Стоит отметить, что вы должны добавить папку, в которой они находятся, к своему пути, не путь к самому файлу сценария. - person Linuxios; 18.11.2019
comment
@Linuxios А, а мне нужно добавить путь к самому файлу или только к его папке? - person Daniel Springer; 18.11.2019
comment
Просто папка. PATH - это список мест (папок; каталогов), где оболочка будет искать команды, которые вы пытаетесь запустить. Например, когда вы запускаете wget ..., оболочка ищет и находит двоичный файл wget в /usr/bin, например, который находится в PATH по умолчанию. - person Linuxios; 18.11.2019
comment
Небольшое примечание, если на вашем пути есть пробел. тогда вам нужно заключить свой путь в двойные кавычки, например: export PATH=$PATH:"/Applications/Android Studio.app/Contents" - person Hamza Waleed; 09.06.2021

Фактически, использование 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 :
person ony    schedule 06.08.2013
comment
Хороший ответ. В моем случае ~/.zshrc берется после .profile и перезаписывает все в .profile. Я потянул меня за волосы, чтобы понять это. - person Khanh Nguyen; 17.06.2014
comment
Для случая добавления скобки не нужны, если вы не добавляете более одного элемента. Также часто не нужны кавычки. Итак, простой и короткий способ добавления: - person Micah Elliott; 12.06.2015
comment
@SuperUberDuper, вы должны понимать, что почти любая оболочка unix просто читает файлы запуска, что делает почти то же самое, как если бы вы вводили их в оболочку в интерактивном режиме. Что касается файлов rc, вы можете найти интересный ответ на этот вопрос - person ony; 07.03.2016
comment
Можно избежать явного экспорта с -x и оставить только уникальные значения в переменной с -U, по умолчанию предполагается двоеточие, поэтому это может быть: typeset -TUx PATH path - person Grief; 16.03.2017
comment
Я вижу использование path и PATH, это разные сущности? - person CousinCocaine; 07.11.2019
comment
@CousinCocaine, вы правы. Переменные ZSH чувствительны к регистру. typeset -T позволяет связать PATH и path вместе особым образом, что внутренне ZSH управляет переменной массива path и отражает ее содержимое в PATH как скаляр. - person ony; 18.11.2019
comment
Как мне точно установить, какой должен быть PATH, а не добавлять к нему? Поскольку каждый раз, когда выполняется .zshrc, PATH получает все, что объявлено в .zshrc, добавляемое к нему снова и снова. - person Daniel Springer; 18.11.2019
comment
@DanielSpringer, во втором примере есть подсказка. Просто написав path=(...), вы установите его. Возможно, вас также заинтересует комментарий @Grief о -U. И я бы рекомендовал изменить PATH среду из ~/.*profile-подобных файлов, чтобы они не выполнялись при запуске внутренней оболочки. См. Также что-то вроде shreevatsa .wordpress.com / 2008/03/30 / или другие подобные советы. - person ony; 24.11.2019
comment
Кажется, что путь = добавляется к пути, а не устанавливается. Чего я не знал, так это того, что этот путь сбрасывается при перезапуске терминала / оболочки / (возможно?) Сеанса входа в систему. - person Daniel Springer; 26.11.2019
comment
@DanielSpringer, нет. Если вы хотите, чтобы это было так, тогда: path=(...) (без ссылок на $path или $PATH внутри) назначает, path=(... $path) добавляет в начало и path+(...) добавляет. - person ony; 01.12.2019
comment
Вы даже можете использовать его как однострочник: export path=(... $path). - person caram; 05.01.2020
comment
У меня это не работает на моем Mac. Я использую один лайнер-ответ ниже, который обновляет внутри ~ / .zshrc. - person Randy; 05.05.2020
comment
@KhanhNguyen, как я могу узнать источник этих файлов? Есть cmd? - person Timo; 31.12.2020
comment
@Timo, в случае zsh вы можете попробовать что-нибудь вроде zsh -x -i -l -c true, чтобы увидеть все команды во время запуска оболочки. Это -l имитирует запуск, подобный входу в систему (как это происходит из текста VT или более ssh). Но вы должны понимать, что не всегда zsh будет запускаться как логин (например, графический сеанс), и какой-либо другой родительский процесс может каким-то образом исходить .profile перед тем, как порождать не входящий в систему zsh подпроцесс, который наследует переменные среды (включая PATH) от родительского процесса. - person ony; 01.01.2021
comment
Что, если я хочу использовать $ HOME внутри ''? path + = ('$ HOME / etc / etc'), похоже, не работает - person Rotkiv; 28.01.2021
comment
@Rotkiv, это немного другой вопрос о том, как интерпретируются одинарные / двойные кавычки. Я предполагаю, что расширение zsh покрывает это. Обычно двойные кавычки позволяют интерполяцию строк, например "$HOME/etc/etc", но одинарные кавычки упрощают представление текста, который не должен подвергаться особой обработке. Обратите внимание, что вы всегда можете смешивать формы с одним аргументом, чтобы получить что-то вроде "$HOME"'/etc/etc' (двойные + одинарные кавычки) или "$HOME"/etc/etc (двойные кавычки + без кавычек). P.S. Да, мне лень пытаться найти ссылку на хороший ответ на SO: P - person ony; 01.02.2021
comment
В macOS вы можете добавить и добавить к своей переменной пути, как описано в сообщении, добавив в файл .zshrc. Он работает без экспорта PATH. - person Jost; 27.03.2021
comment
Если этот синтаксис добавления или добавления не работает для вас, убедитесь, что вы используете нижний регистр path. Нижний регистр path - это массив. - person Yerke; 17.06.2021

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

path+=/some/new/bin/dir

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

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

Обычное интерактивное использование

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

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

Обычное использование конфигурации

Вы можете разбросать настройки пути вокруг вашего .zshrc (как указано выше), и это, естественно, приведет к тому, что ранее перечисленные настройки будут иметь приоритет (хотя иногда вы все же можете использовать предварительную форму path=(/some/new/bin/dir $path)).

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

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

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

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

Вы даже можете запретить PATH принимать повторяющиеся записи (см. это и это):

typeset -U path
person Micah Elliott    schedule 11.06.2015
comment
Разве это не должно быть «путь + =: / foo / bar»? (с двоеточием) - person andrew lorien; 19.09.2017
comment
@andrewlorien Я обновил ответ подробностями о разделителе двоеточия. - person Micah Elliott; 19.09.2017
comment
Обратите внимание: если после пути стоит комментарий, то нам нужны кавычки, например path+='my/path' # for fun. Это очевидно, если у вас есть пробелы, но не так много, если у вас есть комментарии. - person Franklin Yu; 06.03.2019
comment
(Обратите внимание, что нет: не требуется / требуется в качестве разделителя.) Это верно только для строчной буквы path. Для PATH требуется предшествующий :, как показано в .zshrc PATH+=:/Users/path/to/my/folder - person Emmett R.; 18.06.2020
comment
Я использую много exec zsh, потому что работаю с плагинами из oh-my-zsh. Каждый раз, когда я выполняю exec, путь становится больше. Должен ли я время от времени использовать путь по умолчанию? - person Timo; 15.10.2020
comment
Для ZSH, чтобы интерпретировать $ PATH как массив и сделать его уникальным, я считаю правильным способом typeset -aU path - person cseder; 02.07.2021

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

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

or

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

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

person Siva Praveen    schedule 13.12.2017
comment
Безупречно работал на OSX с оболочкой Zsh. - person Stryker; 02.02.2018
comment
Работал как шарм! - person Akbar Sha Ebrahim; 15.03.2019

  1. Добавлен путь к ~ / .zshrc

    sudo vi ~/.zshrc

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

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

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

    source ~/.zshrc

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

    echo $PATH

person saneryee    schedule 10.07.2019
comment
Это путь Bash. - person CousinCocaine; 07.11.2019
comment
эффективный способ сделать - person Milan Tarami; 09.11.2020

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

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

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

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

person Dimitar    schedule 08.05.2018
comment
Не могли бы вы рассказать, чем этот ответ отличается от тот же ответ, что и 5 лет назад? - person Franklin Yu; 06.03.2019
comment
в этом ответе не сказано, что вы должны добавить эту строку кода в файл, если вы просто запустите ее так, что она изменится только в текущих окнах, и это не объясняется в исходном ответе - person Dimitar; 06.03.2019