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是 shell 搜尋執行檔的目錄的冒號分隔清單。PATH操縱是困難的,但有工具。我使用 Stephen Collyer 的 bash_path_funcs,早在 2000 年就在 Linux Journal 中進行了描述:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/376​​8 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變數包含路徑的多個副本,使其過長。

這可以透過 shell 特定的(並且可能是唯一的)方式來處理zsh。在該 shell 中,標量$PATH變數與陣列變數「綁定」$path(在上面的一小段 shell 程式碼中使用),這表示更改一個變數將自動更新另一個變數。此外,在zshshell 中,陣列變數可以宣告為「僅包含唯一元素」。將其應用於PATHpath變量,我們得到了一種確保PATH不會像您所做的那樣增長的方法。

typeset -g -U PATH path

選項-g使其typeset將給定變數宣告為「全域」(而不是目前作用域的「局部」),-U並使path變數僅保留每個變數的第一次出現。

將該typeset命令新增至 的第一個命令中~/.zshenv~/.zprofile~/.zshrc新增至主目錄中的第一個命令中,將確保它對於終端機中的互動式 shell 會話處於活動狀態。

$ 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,則只有新路徑的第一次出現才會保留在變數中。

相關內容