echo -e \e 不会在 macOS 上打印 bash 脚本的转义信息

echo -e \e 不会在 macOS 上打印 bash 脚本的转义信息

我刚搬到Mac。我正在使用在bash.脚本本身可以工作,但是它是为了产生彩色输出而编写的,但它被破坏了。

这是脚本的前两行:

#!/bin/bash

echo -e -n "\e[0m\e[32mhks>>>\e[2m "
  • 我的期望是运行它时它会产生亮绿色的zsh输出。hks>>>
  • 然而,产生的输出是:
    matthiashuttar@mac hks % hks bla
    \e[0m\e[32mhks>>>\e[2m \e[91mfailed to resolve target\e[0m
    

我知道这不是zsh问题,因为我可以按原样执行该echo语句zsh,它将产生正确的绿色输出。

有人可以指出我所缺少的东西吗?

答案1

MacOS 附带了 bash 的旧版本 (3.2.x),因此在其他系统上运行的 bash 脚本可能无法在 macOS 上运行。 macOS 上的 bash 版本不支持\e作为echo.

这似乎是 bash 1.x 到 3.x 中的一个错误,在 4.0 中已修复。该手册将 列为\e支持的转义序列之一echo,但help echo列出了\E和 不支持\e。 (尽管深入研究代码,我看不出\e和 的\E处理方式有所不同——但从实验来看,它们是不同的。)

(由于不一致,肯定存在错误。但我认为当时仅支持\E是所需的行为,大概是因为它是一个非标准扩展,并且 shell 圈子里有一个习惯,主要来自命令行选项,小写字母是标准的东西和大写字母是非标准的东西或现代的补充,所以错误是手册错误地列出了\e。)

printf$'…'使用不同的代码进行反斜杠转义,甚至\e在 bash 3.2.x 中都可以识别。或者,您可以使用八进制转义序列,该序列适用于所有 sh 风格的 shell。

因此,以下任何一项都可以代替echo -e -n '\e…'

  • echo -e -n '\033…'(适用于大多数 sh 风格的 shell,但有些不支持-e-n作为选项)
  • printf '\033…'(请注意,any%必须加倍;%s如果有变量,则使用一个额外的参数)(适用于所有 sh 风格的 shell)
  • printf %b '\033…'(适用于所有 sh 风格的 shell)
  • printf '\e…'(请注意,any%必须加倍;%s如果有变量,请使用额外的参数)
  • printf %b '\e…'
  • echo -n $'\e…'
  • echo -n -e '\E…'

相关内容