bash perl 路径中的数组切片奇怪语法:`${PATH:+:${PATH}}"`

bash array slicing strange syntax in perl path: `${PATH:+:${PATH}}"`

在 Linux Ubuntu 上,当您执行 sudo apt update && sudo apt install perl 时,它会将以下内容添加到您的 ~/.bashrc 文件的底部(至少,很多个月后,我认为这是添加这些行的原因):

PATH="/home/gabriel/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/home/gabriel/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/home/gabriel/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/home/gabriel/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/home/gabriel/perl5"; export PERL_MM_OPT;

这种奇怪的语法在许多行中有什么作用,包括在第一行中?它似乎是某种 bash 数组切片:

${PATH:+:${PATH}}

${PATH} 部分非常简单:它读取 PATH 变量的内容,但其余部分对我来说非常神秘。

这不是数组切片;它使用了 POSIX 参数扩展运算符之一。从 bash 手册页的参数扩展部分,

${parameter:+word}

Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.

如果 PATH 不为空,则确保仅向值添加 : 是一种复杂的方法。一种更长、更清晰的书写方式是

if [ -n "$PATH" ]; then
    PATH=/home/gabriel/perl5/bin:$PATH
else
    PATH=/home/gabriel/perl5/bin
fi        

但是,由于在获取 .basrhcPATH 是空的几乎是不可思议的,所以直接添加新路径并完成它会更简单。

PATH=/home/gabriel/perl5/bin:$PATH

如果 PATH 实际上以 : 结尾,它会在搜索路径中隐含地包含当前工作目录,出于安全原因,这不是一个好主意。同样来自 bash 手册页,在 PATH:

条目下的 Shell 变量部分

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.


顺便说一句,了解各种安装程序试图添加到您的 shell 配置中的内容是很好的。这并不总是必要的,有时可以主动更改您已经配置的内容。

我更希望软件包只打印说明需要添加到您的配置中的内容(以及为什么),并留给用户进行适当的修改。

What does this strange syntax do in many of the lines, including in the first line?

它是 parameter expansion${parameter:+word} 形式,其中 word 成为扩展值,如果 parameter 没有取消设置并且没有空字符串的值(a.k.a.null).