Каков правильный формат переменной PATH

Идиоматический способ — просто использовать массив reply. Если вы хотите, вы можете использовать флаг (P)и вернуться в массив, имя которого передается функции:

myfunc() {
  local arrayname=${1:-reply}; shift
  #...
  : ${(PA)arrayname::="${args[@]}"}
}
-2
23.10.2021, 14:46
2 ответа
$ printf '%s\n' $path | sort | uniq -c
  16 /Library/Apple/usr/bin
  16 /Library/Frameworks/EdgeDB.framework/bin
  16 /Library/Frameworks/Python.framework/Versions/3.9/bin
  16 /Users/hari/.cargo/bin
  16 /Users/hari/.edgedb/bin
  16 /Users/hari/.fig/bin
   1 /Users/hari/.fzf/bin
   4 /Users/hari/.npm/bin
   2 /Users/hari/.pub-cache/bin
   1 /Users/hari/Library/Android/sdk/platform-tools/.
   8 /Users/hari/flutter/bin
  16 /Users/hari/go
  16 /Users/hari/go/bin
   1 /Users/hari/google-cloud-sdk/bin
  16 /bin
  16 /opt/X11/bin
  16 /sbin
  16 /usr/bin
  16 /usr/local/bin
  16 /usr/local/go
  16 /usr/local/go/bin
  16 /usr/sbin
   1 usr/local/opt/avr-gcc@8/bin

Как видите, ваша переменная PATHсодержит несколько копий путей, что делает ее чрезмерно длинной.

Это можно было бы обработать способом, специфичным (и, возможно, уникальным )для оболочки zsh. В этой оболочке скалярная переменная $PATH«привязана» к переменной-массиву $path(, используемой в коротком фрагменте кода оболочки выше ), что означает, что изменение одной из них автоматически обновит другую. Кроме того, в оболочке zshпеременная массива может быть объявлена ​​как «содержащая только уникальные элементы». Применяя это к переменным PATHи path,мы получаем способ убедиться, что PATHне растет так, как это сделали ваши.

typeset -g -U PATH path

Параметр -gдля typesetпозволяет объявлять данные переменные как «глобальные» (, а не как «локальные» для текущей области ), а -Uзаставляет переменную pathсохранять только первое вхождение каждой переменной.

Добавление этой команды typesetк первой из ~/.zshenv, ~/.zprofileили ~/.zshrc, которая существует в вашем домашнем каталоге, гарантирует, что она активна для сеансов интерактивной оболочки в терминале.

$ typeset -g -U PATH path
$ printf '%s\n' $path  | sort | uniq -c
   1 /Library/Apple/usr/bin
   1 /Library/Frameworks/EdgeDB.framework/bin
   1 /Library/Frameworks/Python.framework/Versions/3.9/bin
   1 /Users/hari/.cargo/bin
   1 /Users/hari/.edgedb/bin
   1 /Users/hari/.fig/bin
   1 /Users/hari/.fzf/bin
   1 /Users/hari/.npm/bin
   1 /Users/hari/.pub-cache/bin
   1 /Users/hari/Library/Android/sdk/platform-tools/.
   1 /Users/hari/flutter/bin
   1 /Users/hari/go
   1 /Users/hari/go/bin
   1 /Users/hari/google-cloud-sdk/bin
   1 /bin
   1 /opt/X11/bin
   1 /sbin
   1 /usr/bin
   1 /usr/local/bin
   1 /usr/local/go
   1 /usr/local/go/bin
   1 /usr/sbin
   1 usr/local/opt/avr-gcc@8/bin

Чтобы добавить путь в конец PATH,

path+=( '/new/path' )

или

path=( $path '/new/path' )

Чтобы добавить путь к началу PATH,

path=( '/new/path' $path )

Если переменная pathбыла сделана "уникальной" с помощью typeset -U, в переменной будет сохранено только первое вхождение нового пути.

2
25.10.2021, 06:11

PATH— это разделенный двоеточием -список каталогов, в которых ваша оболочка ищет исполняемые файлы. PATHМанипуляции сложны, но есть инструменты. Я использую функции bash _path _Стивена Коллиера, описанные в Linux Journal еще в 2000 году :

.

https://www.linuxjournal.com/article/3645https://www.linuxjournal.com/article/3768https://www.linuxjournal.com/article/3935

Функция addpathдобавляет запись в путь, только если ее там нет изначально. delpath -nудаляет из пути все несуществующие -каталоги. uniqpathудаляет дубликаты.

Вы можете получить файл pathfunc.tgzизhttps://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

3
23.10.2021, 17:05

Теги

Похожие вопросы