我正在查看~/.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 ]]
。要么我理解错了,要么剧本作者犯了错误。