我最近在我的 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:
。