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

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

У меня macOS, и вот что я получаю, когда делаю этоecho $PATH

usr/local/opt/avr-gcc@8/bin:/Users/hari/google-cloud-sdk/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.pub-cache/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/Library/Android/sdk/platform-tools/.:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.pub-cache/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.npm/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/flutter/bin:/Users/hari/.edgedb/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Library/Frameworks/EdgeDB.framework/bin:/opt/X11/bin:/Library/Apple/usr/bin:/Users/hari/.cargo/bin:/Users/hari/.fig/bin:/usr/local/go:/Users/hari/go:/Users/hari/go/bin:/Users/hari/.fzf/bin

Это правильно? Это длинное и если длинное, как мне сделать его короче. Помогите пожалуйста

решение1

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

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://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

решение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, в переменной будет сохранено только первое вхождение нового пути.

Связанный контент