代码之家  ›  专栏  ›  技术社区  ›  Gabriel Staples

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

  •  0
  • Gabriel Staples  · 技术社区  · 3 年前

    在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

    2 回复  |  直到 3 年前
        1
  •  2
  •   Gabriel Staples    3 年前

    这不是阵列切片;这是POSIX参数展开运算符之一的使用。从 bash 手册页,在参数展开部分,

    parameter :+ word }

    如果 参数 如果为null或未设置,则不显示任何内容 单词

    这是一种确保只添加 : 如果 PATH 一开始不是空的。一种更长更清晰的书写方式是

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

    路径 .basrhc

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

    如果 路径 实际上以一个 ,它将在搜索路径中隐式包含当前工作目录,出于安全原因,这不是一个好主意。也从 手册页,在有关Shell变量的部分中的 路径 :

    中的零长度(null)目录名 PATH的值表示当前目录。空目录 尾随冒号。


    另一方面,最好了解各种安装程序试图添加到shell配置中的内容。它并不总是必要的,有时可以主动更改您已经配置的内容。

    我更希望软件包简单地打印出需要添加到配置中的内容(以及原因)的说明,并将其留给用户进行适当的修改。

        2
  •  1
  •   konsolebox    3 年前
    What does this strange syntax do in many of the lines, including in the first line?
    

    ${parameter:+word} 形式 parameter expansion 哪里 word parameter 未取消设置且不具有空字符串的值(也称为null)。