【问题标题】:What's the meaning of '[m' and how to get rid of it in this expression?'[m' 是什么意思,在这个表达式中如何去掉它?
【发布时间】:2021-05-21 01:48:25
【问题描述】:

首先对环境做一点说明:

  • 重击 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

问题是:

  1. [m 是什么意思?
  2. 为什么[m 在变量中?
  3. 摆脱那个角色值得吗?怎么样?

【问题讨论】:

  • 很确定这是一个 ANSI 颜色代码。如果这是正确的,你可以摆脱它。
  • @raaowx :看起来您在设置ip 时遇到了颜色转义码。其中还应该有一个 escape 字符(使用xxd <<<"$ip" 进行检查)。 cut 不会产生它们,所以它要么是 ifconfig(用 ifconfig|xxd 测试它)要么是 grep。在后一种情况下,我会得出结论,您已将环境变量 GREP_OPTIONS 设置为导致着色的内容。
  • @user1934428 也许我的别名 grep='grep —color=always' 有干扰?
  • @user1934428 我现在可以确认别名grep='grep --color=always' 是问题所在。
  • 永远不要对别名使用相同的名称作为别名的命令。你可以做一个alias g='grep --color=always'。通常,我们只在命令行上使用别名,而不是在函数或脚本的主体中,调用它g 也更容易输入。

标签: bash shell special-characters


【解决方案1】:

这些是 ANSI 颜色代码。他们负责颜色和其他一些格式。 Here 您对可用的内容有一个简短的概述。基本上你可以删除这样的序列,它们纯粹是装饰性的 - 当然只有当你对颜色或例如粗体不感兴趣时​​。很多人(包括我自己)都喜欢将这些东西构建到脚本之类的东西中以提高可读性。

有关更多信息,请参阅the article in the Arch Wiki。如果您有兴趣,这是一个很好的起点。

【讨论】:

  • 是的,你完全正确。有一个 ANSI 颜色来自我的 grep 别名。我有grep 作为grep --color=always 的别名。由于该别名,for 中的 $ip 会检索 IP 和 ANSI 颜色。
【解决方案2】:

最后我能够摆脱[m 字符。回答我自己的问题:

  1. [m 是什么意思?

嗯,它是终端中用于美观或可读性目的的 ANSI 颜色代码的一部分。您可以在@neon 答案中找到更多信息。

  1. 为什么[m 在变量中?

找出来有点棘手,但由于循环表达式$(ifconfig | grep inet\ | cut -f 2 -d \ ),ANSI 颜色代码作为 var 的一部分输入。我有一个grep 的别名,它是grep --color=always。由于此别名,grep 始终包含匹配文本周围的 ANSI 颜色代码,因此 $ip 包含实际 IP 地址和 ANSI 颜色代码。

  1. 摆脱那个角色值得吗?怎么样?

是的,这完全值得。事实上,我学到了一些新东西。别名grep=grep --color=always 不值得,因为可能会导致这种麻烦。现在,我认为最好使用grep --color=auto,所以grep 仅在输出到终端stdout 时应用颜色。你可以在this question找到更多信息。

关于“如何?”,我认为我的最后一段解释了这一点,但解决方案是:

将别名grep='grep --color=always' 更改为grep='grep --color=auto' 并删除echo 中的参数扩展。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2011-04-15
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多