Чи є спосіб додати каталог в мій PATH в zsh, тільки якщо він ще не присутній?


15

Чи є простий спосіб в zsh додати каталог до мого PATH, лише якщо він ще не присутній? (або, загалом, будь-яка змінна середовище). Я спробував:

PATH+=/my/directory

... але якщо це виконується двічі, він додається двічі.


2
@uther, це не дублікат, оскільки це інше питання стосується bash, тоді як це питання для zsh, який має власний спосіб вирішити цю проблему.
Стефан Шазелас

Відповіді:


32

In zsh $PATHприв’язаний (див. typeset -T) До $pathмасиву. Ви можете змусити цей масив мати унікальні значення за допомогою:

typeset -U path

А потім додайте шлях за допомогою:

path+=(~/foo)

Не турбуючись, якщо це вже було.

Щоб додати його спереду, виконайте:

path=(~/foo "$path[@]")

або:

path[1,0]=~/foo

якщо ~/fooвже було в $pathцьому, перенесе його на фронт.


Ви не маєте на увазі typeset -Ug path? Коли я використовую typeset -U pathу своєму ~/.zshrcфайлі, я завжди отримую помилку про те, що нічого не стоїть на шляху, поки працює
zshrc

@eMxyzptlk, дивно. -gполягає у тому, щоб уникнути обмеження сфери застосування, але в цьому ~/.zshrc, сфера застосування вже є глобальною. Крім того, я ніколи не бачив zshскаржитися на порожнє $PATH(за винятком команди, звичайно, не знайдено помилок).
Стефан Шазелас

3

Додайте export -U PATH=~/foo${PATH:+:$PATH}до одного зі своїх запуску файлів. -UЗберігає тільки перше входження значення в масивах або певних :роздільники змінних як PATH.


-3

Вам доведеться зробити щось на кшталт:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Це працює лише в тому випадку, якщо newpathрозміщено бу два ":", потрібно розглянути випадки, коли це на початку або в кінці аналогічно.

Урх.


1
Це можна зробити всередині оболонки, лише з функціями Bourne / POSIX. Це дозволяє уникнути цитування головного болю (принаймні, зробити так echo "$PATH": завжди ставити подвійні лапки навколо змінних підстановок ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.