Path

第一個導出路徑不應該沒有 :$PATH

  • March 14, 2021

我注意到的是,當我將 a 添加:$PATH到 firstPATH時,它會重複所有路徑echo

我使用MANPATH例如,但同樣的事情發生在PATH變數上。

# I use MANPATH here
export MANPATH="/usr/local/share/man" # Here no :$MANPATH
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

這輸出:

$ echo $MANPATH
/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man

但是當我添加:$MANPATH到第一個時:

export MANPATH="/usr/local/share/man:$MANPATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

這輸出:

$ echo $MANPATH
/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

如您所見,所有的 MANPATH 都是重複的。

所以我的問題是:

  1. 我應該在第一行的末尾省略:$PATHor嗎?$MANPATH
  2. 為什麼當我將它添加到第一行的末尾時它會重複所有路徑?

如果,當你跑

export MANPATH="/usr/local/share/man:$MANPATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"

你最終得到了存在的MANPATH內容

/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

這意味著MANPATH已經包含

/usr/local/opt/make/libexec/gnuman:/usr/local/opt/coreutils/libexec/gnuman:/usr/local/share/man:

在第一次分配之前(即您沒有從新/空變數開始)。

正如您所展示的,意思是“將目前擴展為’bar’foo=bar:$foo的字元串連接起來並將結果分配給”。如果您使用;開始一系列分配,則重置變數 如果你.foo``foo``foo``foo=bar foo``foo=bar:$foo

來到標題中提出的問題,您應該使用foo=bar(重置)還是foo=bar:$foo(擴展)取決於上下文。通常,添加路徑的 shell 配置文件PATH意味著每個使用者會話僅執行一次。他們可以做的更保守的選擇是擴展PATH,因為其他程序在執行之前可能已經添加了有用的組件。

如果一個shell腳本需要保證只擴展一個環境變數一次,無論執行多少次,都需要檢查該變數是否已經包含了要添加的組件。有關這方面的更多資訊,請參閱如何干淨地添加到 $PATH?

引用自:https://unix.stackexchange.com/questions/639141