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


24

最近、私のcygwinプロファイルで、より正確に次のことに気付きました。

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

どういう意味ですか?なぜ$ PATHだけではないのですか?これは「$ PATHが存在する場合:$ PATHを追加する」ですか?私の目的は、順序を入れ替えて、cygwinパスをwindowsパスの後ろに置くことです。過去には

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

しかし、これは私を混乱させます。たぶん私はやるべき

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

$ PATHの最後に:を追加しますか?


1
本当にSEホット質問側バーの書式を台無しあなたの質問のタイトルi.imgur.com/g6pPmzf.png
ブラッド・

回答:


38

:+形式でパラメータ展開

$ {parameter:+ [word]}:代替値を使用します。

パラメーターが未設定またはヌルの場合、ヌルが置き換えられます。それ以外の場合は、単語の展開(または、単語が省略された場合は空の文字列)に置き換えられます。

つまり、変数$varが定義されている場合echo ${var:+foo}は印刷され、定義されfooていない場合は空の文字列が印刷されます。

2番目:は特別なものではありません。これは、のディレクトリのリストで区切り文字として使用される文字$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 :自体は、現在のディレクトリをに追加し$PATHます。使用するとPATH="/new/dir${PATH:+:$PATH}"これを回避できます。必要にPATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"応じて使用することも、必要に応じて使用PATH="$PATH:/usr/local/bin:/usr/bin"することもできます。唯一の違いは、前者が余分なものを追加する可能性があるという:こと$PATHです。


余分:なものは有害ですか?

4
@tacは実際にはありません。現在のディレクトリを追加するだけです$PATH(@AndyBの答えを参照)。これは状況によってはセキュリティ上のリスクになる可能性があります(たとえば、攻撃者が破壊的なスクリプトを現在のディレクトリにアップロードして名前を付けたlsなど)。ほとんどの場合、気にしません。実際、一部のシステムはPATHデフォルトで現在のディレクトリを追加します。
テルドン

パスは、配列としてそれを処理する方法を好む1つの場所cshです。
ホームトースト

8

正解です。「$ PATHが存在する場合-nullではない場合-:$ PATHを追加する」という意味です。

$ PATHが未定義の場合、先頭(または末尾)コロンを追加したくないため、$ PATHが存在するかどうかを確認する必要があります。パス内の長さがゼロ(ヌル)のディレクトリ名は、、:/usr/local/bin:/usr/binまたは/usr/local/bin:/usr/bin:、またはのよう/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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.