'[m' 的含义是什么以及如何在此表达式中摆脱它?
What's the meaning of '[m' and how to get rid of it in this expression?
首先简单介绍一下环境:
- Bash 5
- 默认 MacOS 终端
在我的 bash_profile
中,我声明了以下函数以快速查看我的计算机拥有的所有 IPv4:
YB=$(tput setaf 11)
WB=$(tput setaf 15)
RESET=$(tput sgr0)
lanconfig() {
for ip in $(ifconfig | grep inet\ | cut -f 2 -d \ ); do
echo -e "$WB LAN IP:$YB ${ip:3} $RESET"
done
}
使用该函数一切正常,我得到以下输出:
LAN IP: 127.0.0.1
LAN IP: 192.168.1.100
其中 LAN IP:
为白色,实际 IP 地址为黄色。
现在您了解了背景,让我们假设一分钟,函数内部的 echo
对 $ip
执行参数扩展,它只打印 var。类似于:
echo -e "$WB LAN IP:$YB $ip $RESET"
因此 echo
,黄色不适用于 IP。我很震惊,我不明白。通过参数扩展进行一些测试,我发现扩展 ${ip:1}
打印出 [m127.0.0.1
问题是:
[m
是什么意思?
- 为什么
[m
在变量中?
- 摆脱那个角色值得吗?怎么样?
这些是 ANSI 颜色代码。他们负责颜色和一些其他格式。 Here 您对可用的内容有一个简短的概述。基本上你可以删除这样的序列,它们纯粹是装饰性的——当然前提是你对颜色或例如粗体不感兴趣。很多人(包括我自己)都喜欢把这些东西做成脚本之类的来提高可读性。
有关详细信息,请参阅 the article in the Arch Wiki。如果您有兴趣,这是一个很好的起点。
我终于摆脱了 [m
个字符。回答我自己的问题:
[m
是什么意思?
好吧,它是终端中出于美观或可读性目的使用的 ANSI 颜色代码的一部分。您可以在@neon 回答中找到更多信息。
- 为什么
[m
在变量中?
要找到它有点棘手,但由于循环表达式 $(ifconfig | grep inet\ | cut -f 2 -d \ )
,ANSI 颜色代码作为 var 的一部分输入。我有一个 grep
的别名 grep --color=always
。由于此别名,grep
始终包含匹配文本周围的 ANSI 颜色代码,因此 $ip
包含实际 IP 地址和 ANSI 颜色代码。
- 摆脱那个角色值得吗?怎么样?
是的,完全值得。事实上,我学到了一些新东西。别名 grep=grep --color=always
不值得,因为可能会引起这种麻烦。现在,我认为使用 grep --color=auto
更好,因此 grep
仅在输出到终端 stdout
时应用颜色。您可以在 this question.
中找到更多信息
关于“怎么做?”,我认为我的最后一段解释了这一点,但解决方案是:
将别名 grep='grep --color=always'
更改为 grep='grep --color=auto'
并删除 echo
中的参数扩展。
首先简单介绍一下环境:
- Bash 5
- 默认 MacOS 终端
在我的 bash_profile
中,我声明了以下函数以快速查看我的计算机拥有的所有 IPv4:
YB=$(tput setaf 11)
WB=$(tput setaf 15)
RESET=$(tput sgr0)
lanconfig() {
for ip in $(ifconfig | grep inet\ | cut -f 2 -d \ ); do
echo -e "$WB LAN IP:$YB ${ip:3} $RESET"
done
}
使用该函数一切正常,我得到以下输出:
LAN IP: 127.0.0.1
LAN IP: 192.168.1.100
其中 LAN IP:
为白色,实际 IP 地址为黄色。
现在您了解了背景,让我们假设一分钟,函数内部的 echo
对 $ip
执行参数扩展,它只打印 var。类似于:
echo -e "$WB LAN IP:$YB $ip $RESET"
因此 echo
,黄色不适用于 IP。我很震惊,我不明白。通过参数扩展进行一些测试,我发现扩展 ${ip:1}
打印出 [m127.0.0.1
问题是:
[m
是什么意思?- 为什么
[m
在变量中? - 摆脱那个角色值得吗?怎么样?
这些是 ANSI 颜色代码。他们负责颜色和一些其他格式。 Here 您对可用的内容有一个简短的概述。基本上你可以删除这样的序列,它们纯粹是装饰性的——当然前提是你对颜色或例如粗体不感兴趣。很多人(包括我自己)都喜欢把这些东西做成脚本之类的来提高可读性。
有关详细信息,请参阅 the article in the Arch Wiki。如果您有兴趣,这是一个很好的起点。
我终于摆脱了 [m
个字符。回答我自己的问题:
[m
是什么意思?
好吧,它是终端中出于美观或可读性目的使用的 ANSI 颜色代码的一部分。您可以在@neon 回答中找到更多信息。
- 为什么
[m
在变量中?
要找到它有点棘手,但由于循环表达式 $(ifconfig | grep inet\ | cut -f 2 -d \ )
,ANSI 颜色代码作为 var 的一部分输入。我有一个 grep
的别名 grep --color=always
。由于此别名,grep
始终包含匹配文本周围的 ANSI 颜色代码,因此 $ip
包含实际 IP 地址和 ANSI 颜色代码。
- 摆脱那个角色值得吗?怎么样?
是的,完全值得。事实上,我学到了一些新东西。别名 grep=grep --color=always
不值得,因为可能会引起这种麻烦。现在,我认为使用 grep --color=auto
更好,因此 grep
仅在输出到终端 stdout
时应用颜色。您可以在 this question.
关于“怎么做?”,我认为我的最后一段解释了这一点,但解决方案是:
将别名 grep='grep --color=always'
更改为 grep='grep --color=auto'
并删除 echo
中的参数扩展。