私は最近、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の最後に:を追加するには?
:+
は パラメータ展開 の形式です。
$ {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
に追加する可能性があることです。
正解です。「$ 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"