${PATH:+:${PATH}} 是什么意思?

${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 末尾附加 : ?

答案1

:+是一种形式参数扩展:

${参数:+[字]}:使用替代值。

如果参数未设置或为null,则以null代替;否则,应替换 word 的扩展(如果省略 word,则替换为空字符串)。

换句话说,如果变量$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:本身将当前目录添加到$PATH.使用PATH="/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 未定义,您不想添加前导(或尾随)冒号。路径中的零长度 (null) 目录名,如:/usr/local/bin:/usr/bin, or /usr/local/bin:/usr/bin:, or /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.
          ...

这可能不是您想要做的。

下面两行做同样的事情:

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}:}它基本上表示如果PATH已定义,则不要仅使用该PATH值,而是返回 的替代值PATH:

相关内容