【问题标题】:bash array slicing strange syntax in perl path: `${PATH:+:${PATH}}"`bash 数组在 perl 路径中切片奇怪的语法:`${PATH:+:${PATH}}"`
【发布时间】:2022-01-08 20:53:55
【问题描述】:

在 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 变量的内容,但其余部分对我来说非常神秘。

【问题讨论】:

    标签: bash path parameter-expansion


    【解决方案1】:

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

    ${parameter:+word}

    使用备用值。如果 parameter 为 null 或未设置,则没有任何内容 替换,否则替换word 的扩展。

    如果PATH 开始时不为空,则确保您只将: 添加到值中,这是一种复杂的方法。一个更长,更清晰的写作方式是

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

    但是,如果在获取 .basrhc 时,PATH 为空几乎是不可想象的,那么只需预先添加新路径并完成它会更简单。

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

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

    在 PATH 的值表示当前目录。空目录 名称可以显示为两个相邻的冒号,或作为首字母或 尾随冒号。


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

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

    【讨论】:

    • Bash 是我的主要语言之一。我使用它的次数甚至超过了 Python,但它总是让我惊讶于 bash 有多疯狂。 :) 它绝对是目前可读性较差的语言之一。
    • 这一切都源于它的基本工作(运行带有参数的程序)除了空格之外需要 no 语法来分隔每个单词。这意味着几乎所有其他内容都需要一些额外的语法以避免与执行简单命令混淆。
    • (多年来,越来越多的功能被硬塞进一种并非专为它设计的语言中。)
    【解决方案2】:
    What does this strange syntax do in many of the lines, including in the first line?
    

    这是parameter expansion${parameter:+word} 形式,如果parameter 没有取消设置并且没有空字符串的值(也称为null),则word 成为扩展值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2010-11-27
      • 2020-05-22
      • 2020-08-30
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多