我刚搬到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…'