${PATH:+:${PATH}} とはどういう意味ですか?

${PATH:+:${PATH}} とはどういう意味ですか?

私は最近私のcygwinプロファイルでより正確に次のようなものを見つけました。

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

どういう意味ですか?なぜ$ PATHだけを使用しないのですか? 「$PATHが存在する場合は追加:$PATH」ですか?私の意図は、順序を変更し、Windowsパスの後にcygwinパスを置くことです。以前はそうでした。

$PATH:/usr/local/bin:/usr/bin

しかし、これが私を混乱させます。おそらく私がしなければならないと思います。

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

$PATH の末尾に以下を追加します。

答え1

これは:+フォームです。パラメータ拡張:

${パラメータ:+[単語]}:代替値を使用します。

引数が設定されていないか、nullの場合、nullが置き換えられます。それ以外の場合は、単語の拡張(または単語が省略されている場合は空の文字列)を置き換える必要があります。

つまり、変数が$var定義されていればecho ${var:+foo}その変数が印刷されfoo、そうでなければ空の文字列が印刷されます。

二つ目は:特別なことはありませんでした。ディレクトリリストの区切り文字として使用される文字$PATH。したがって、PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"簡単な方法は次のとおりです。

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

:これは、設定されていない場合に追加のコンテンツを追加しないようにする賢い方法です。$PATHたとえば、

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

ただし、PATH設定されていない場合:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A自体は:現在のディレクトリをに追加します$PATHPATH="/new/dir${PATH:+:$PATH}"もちろん、PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"必要に応じて、またはPATH="$PATH:/usr/local/bin:/usr/bin"必要に応じて使用できます。唯一の違いは、電子が追加のディレクトリを追加して:現在のディレクトリを$PATH

答え2

あなたは正しいです。 「$PATH が存在し、空でない場合は、次を追加します。 $PATH」を意味します。

$PATHが定義されていない場合は、先行(または末尾)コロンを追加したくないので、$ PATHが存在することを確認する必要があります。:/usr/local/bin:/usr/bin、または/usr/local/bin:/usr/bin:、またはなど、パスに長さが0の(ヌル)ディレクトリ名は、/usr/local/bin::/usr/bin次のことを意味します。現在のディレクトリの検索

抜粋man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

これはおそらくあなたがしたいことではありません。

次の2行は同じことを行います。

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"

答え3

比較も便利です。選ぶそして基本パラメータ拡張。

:-それを使う${}基本次の値:

${a:-xxx} returns "xxx" if a is not defined.

:+内部を使う${}選ぶ次の値:

${a:+xxx} returns "xxx" if a is defined.

したがって、この場合、デフォルトでは定義された値を使用するのではなく、代替値が返されるという${PATH:+${PATH}:}意味です。PATHPATHPATH:

関連情報