web-dev-qa-db-ja.com

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

私は最近、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の最後に:を追加するには?

26
tofutim

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

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

パラメータが設定されていないかnullの場合、nullに置き換えられます。それ以外の場合、Wordの展開(または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:

:自体は、現在のディレクトリを$PATHに追加します。 PATH="/new/dir${PATH:+:$PATH}"を使用すると、これを回避できます。そのため、必要に応じてPATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"を使用したり、必要に応じてPATH="$PATH:/usr/local/bin:/usr/bin"を使用したりできます。唯一の違いは、前者は:を追加して、現在のディレクトリを$PATHに追加する可能性があることです。

40
terdon

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

$ PATHが定義されていない場合、先頭(または末尾)のコロンを追加したくないため、$ PATHが存在するかどうかを確認する必要があります。 :/usr/local/bin:/usr/bin/usr/local/bin:/usr/bin:、または/usr/local/bin::/usr/binのように、パス内の長さがゼロ(null)のディレクトリ名は、現在のディレクトリを検索を意味します。

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"
9
AndyB