~/.bashrc 中的奇怪比较

~/.bashrc 中的奇怪比较

我正在查看~/.bashrc基于 Arch 的系统上的文件,看到一行我不明白的内容

[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

有人可以解释一下或指出 bash 文档,其中详细介绍了此比较,因为我对此一无所知。

如果重要的话,这里有一段摘录,其中显示了safe_term和 的match_lhs定义方式

use_color=false

# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
    && type -P dircolors >/dev/null \
    && match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

答案1

[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]]

把它拆开,[[ string == pattern ]]就是字符串与模式匹配的比较,模式中的*意思是“任何东西”。右侧$'\n'是一个换行符,TERM只是一个固定字符串,并${safe_term}给出了变量的内容。因此,如果${safe_term}包含 eg xterm,它将查找 string<newline>TERM xterm及其之前或之后的任何内容。左边又是一个换行符,以及${match_lhs}包含的内容。

现在,${match_lhs}设置为dircolors --print-database输出内容,其中包含如下行:

TERM Eterm
TERM ansi
TERM *color*
...

实际上,它尝试首先读取两个配置文件,但我只是假设它们应该包含类似的条目。

${safe_term}来自 的值$TERM,仅进行一些清理(之前的一些行)。

因此,实际上,它测试当前的终端类型是否$TERM包含在 列出的已知终端类型中dircolors

换行符用于将匹配锚定到行的开头,左侧的额外换行符用于第一行匹配的情况(否则前面不会有换行符)。


这里令人困惑的是,至少在我的系统上, 的输出dircolors --print-database包括诸如TERM *color*,TERM con[0-9]*x[0-9]*和 之类的行TERM xterm*。虽然这些是有效的模式,但在我看来,这里的脚本不会将它们用作模式,因为它将它们放在左边[[ str == pattern ]]。要么我理解错了,要么剧本作者犯了错误。

相关内容