Идиоматический способ — просто использовать массив reply
. Если вы хотите, вы можете использовать флаг (P)
и вернуться в массив, имя которого передается функции:
myfunc() {
local arrayname=${1:-reply}; shift
#...
: ${(PA)arrayname::="${args[@]}"}
}
$ 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
, в переменной будет сохранено только первое вхождение нового пути.
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