在MacOSX中使用-e参数时,为什么不回显支持“ \ e”(转义)


36

当我尝试通过内置echo命令使用ANSI转义序列打印出一些彩色文本时,似乎\e我提供的字符串中的转义序列是按字面意义解释的,而不是它应该代表的“转义”。这仅在Snow Leopard中发生-以下示例按Leopard的预期工作。

显然echo支持该-e开关,因为它\n在使用时可以正确解释:

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

但是当我尝试使用时\e,我得到了:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

就像我说的那样,在Leopard中,上述内容将为我提供字符串“ COLORS”(彩色)。

有人知道为什么这可能是预期的更改吗?在Snow Leopard上从Bash脚本打印ANSI转义序列的解决方法如何?

我的Leopard机器3.2.17(1)-release3.2.48(1)-releaseSnow Leopard机器上的Bash shell版本都是。


1
这个问题与职位矛盾。在问题中,您指的是/ bin / echo,而在帖子中,您使用无路径的echo,这很可能是shell的内置echo。
0x89

当然-感谢您的注意。我解决了这个问题以反映这一点。
hasseg

Answers:


24

我无法告诉您为什么它不支持该参数(您可能不得不询问程序员)。我只知道在我的linux机器上,我得到了:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  \0NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     produce no further output
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report echo bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
  • 这没有提到\e逃脱
  • 它说它/bin/echo来自gnu coreutils。随着苹果不时更改其Unix系统组件的来源(例如,从zsh变为bash),请检查/bin/echoLeopard和Snow Leopard之间是否存在更改。如果是gnu,您可以在gnu.org上询问人们为什么选择不包含这些序列。

至于解决方法(更有趣):不使用/bin/echo,但是bash的内置功能echo可在Linux机器上使用。如果他们更改为没有内置回声(甚至更晦涩的东西)的bash,则还可以尝试使用此shell尚不为人所知的功能(至少在bash和zsh中有效):

$ echo $'\e[34m''COLORS'

这是bash的联机帮助页的匹配部分:

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.

4
我不知道$'string'启用了转义序列,谢谢。
hasseg

1
\e不属于POSIX标准;GNU coreutils实现在标准上进行了扩展。OS X没有。
马丁·皮特斯


15

是否\033仍然有效?如果没有,您可以按Ctrl + V,然后按Escape键(如果Mac具有这些键),以在命令行中创建一个真正的控制字符(当然,在脚本中效果不佳,具体取决于编辑器)


5
\033而不是\e工作,谢谢。
hasseg

4
仅供参考,33Escape字符的八进制值。
TachyonVortex

仅供将来读者参考033,以标准化的方式编写八进制。
ocodo


6

为了补充现有的有用答案,并提供一些背景信息

如果你调用echo名称 -与它的路径反对,/bin/echo- 你是在调用Bash的内置,而不是外部工具。

Bash元素等本机Bash元素的行为通常在Bash的意义上是可移植的,这意味着它们在任何能够运行Bash的平台上都应相同

\e是一个奇怪的例外,会影响macOS上的3.x Bash版本(到目前为止,从v10.13.5(High Sierra)开始,出于法律原因,macOS随附了过时的Bash 3.x版本)。

\e(及其别名\E应该echo -e; \e支持已添加到Bash 2.0echo内置函数中。,但莫名其妙地不在macOS的3.x股票版本中。

\e 可以其他平台(例如Windows上的MSYS)的3.x Bash版本中使用。

相反,如果您在macOS上安装并使用4.x Bash,\e 则可以正常工作。


2

他们可能会尝试遵循POSIX:http : //www.opengroup.org/onlinepubs/9699919799/

部分选项指出:

Implementations shall not support any options.


不。该页面继续写:“如果第一个操作数是-n,或者任何操作数包含<backslash>字符,则结果是实现定义的。” 另外,macOS echo会解释-e
吴永伟

2

仅供参考,我们即将在coreutils中为/ bin / echo和/ usr / bin / printf添加\ e支持。注意C标准没有指定\ e,但是gcc,perl,bash,ksh和tcsh支持它


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.