$ {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
布拉德

Answers:


38

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

$ {parameter:+ [word]}:使用替代值。

如果参数未设置或为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 :本身会将当前目录添加到中$PATH。使用PATH="/new/dir${PATH:+:$PATH}"可以避免这种情况。可以肯定的是,您可以PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"根据需要使用,也可以根据需要使用PATH="$PATH:/usr/local/bin:/usr/bin"。唯一的区别是,前者可能会添加额外的内容:,从而将当前目录添加到您的目录中$PATH


多余的:有害吗?
2016年

4
@tac并不是真的,它只是将当前目录添加到您的目录中$PATH(请参阅@AndyB的答案)。在某些情况下,这可能会带来安全风险(例如,攻击者已将破坏性脚本上载到您的当前目录并命名为该文件ls或其他名称),但在大多数情况下,您真的不在乎。实际上,PATH无论如何,有些系统仍默认将当前目录添加到。
terdon

路径是一个地方,我宁愿他们这样csh的把手,然后将其作为数组。
hometoast

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.
          ...

那可能不是您想要的。

以下两行执行相同的操作:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.