Додавання нового запису до змінної PATH в ZSH


188

Я використовую 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десь встановлюється змінна.

Відповіді:


211

Тут додайте цей рядок до .zshrc:

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

EDIT : Це дійсно працює, але відповідь Оні нижче є кращою, оскільки використовує структурований інтерфейс, який ZSH передбачає такі змінні $PATH. Цей підхід є стандартним для bash, але, наскільки я знаю, немає причин використовувати його, коли ZSH надає кращі альтернативи.


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

222

Власне, використання 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"? (з двокрапкою)
andrew lorien

1
@andrewlorien Я оновив відповідь подробицями про роздільник товстої кишки.
Міхей Елліотт

Зауважте, що якщо після шляху є коментар, нам потрібні цитати, наприклад path+='my/path' # for fun. Це очевидно, якщо у вас є пробіли, але не так багато, якщо у вас є коментарі.
Франклін Ю

"(Зауважте, що ні: потрібен / потрібний як роздільник.)" Це справедливо лише для малих літер path. Попередній :обов'язковий для PATH: zshrc PATH+=:/Users/path/to/my/folder
Emmett R.

36

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

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

або

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

Щоб побачити ефект, перейдіть source ~/.zshrcна ту ж вкладку або відкрийте нову вкладку


1
Працював досконало на OSX з оболонкою Zsh.
Стрикер

1
Працював як шарм!
Акбар Ша Ебрагім

14
  1. Додано шлях до ~ / .zshrc

    sudo vi ~/.zshrc

    додати новий шлях

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

    Зберегти ~ / .zshrc

    source ~/.zshrc

  3. Перевірте PATH

    echo $PATH


2
Це Bashшлях.
CousinCocaine

13

ВАРІАНТ 1: Додайте цей рядок до ~ / .zshrc:

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

Після цього вам потрібно запустити, source ~/.zshrcщоб зміни вплинули АБО закрийте це вікно та відкрийте нове

ВАРІАНТ 2: виконайте його всередині консолі термінала, щоб додати цей шлях лише до поточного сеансу вікна терміналу. Якщо ви закриєте вікно / сеанс, воно буде втрачено.


Чи можете ви детальніше пояснити, чим ця відповідь відрізняється від тієї ж відповіді, опублікованої 5 років тому ?
Франклін Ю

у цій відповіді не сказано, що ви повинні додати цей рядок коду до файлу, якщо ви просто запустите його так, що він зміниться лише в поточних вікнах, і це не пояснюється в оригінальній відповіді
Dimitar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.