我注意到,与TERM
设置为环境变量xterm
或者xterm-256color
是Mac OS X的Terminal.app实用尊重大多数ANSI转义码,当为至少那些转义代码涉及到更改文本颜色.
例如:
echo -e "\033[0;31mERROR:\033[0m It worked"
生产:
但是,我对ANSI转义码提供的光标位置操作功能更感兴趣.不幸的是,这种类型的代码在Terminal.app中似乎没有太好用,我已经能够收集到了.例如,我想要做的是这样的事情:
echo -e "\033[sHello world\033[uG'day"
ESC[s
保存当前光标位置,同时ESC[u
恢复上次保存的位置.由于运行上面的脚本,我希望"G'day"中的五个字符在重新定位光标后覆盖"Hello"的五个字符,产生以下结果:
G'day world
实际上,这正是我用iTerm2.app,ConEmu for Windows(运行MinGW或MSYS Git的bash.exe副本)等所得到的.然而,我在Terminal.app中看到的是:
Hello worldG'day
有没有理由这样做,除了Terminal.app之外,只是缺乏对这些代码的支持?有没有办法启用此功能?我有可能有错误配置的东西吗?我的TERM设置?别的什么?
我一直在各处搜索,但没有发现任何与Terminal.app相关的内容.我觉得很奇怪它会通过ANSI转义码支持彩色文本,但不会通过完全相同的技术重新定位光标.这似乎是一个相当明确的标准的相当随意的子集.这就是让我觉得我有一些错误配置的东西,而不是说Terminal.app是应该责备的......但是,我认为它可能根本无法完成.(可能是iTerm2首先存在的原因之一?)
如果有人能对这种情况有所了解,我们将不胜感激!
所以,我做了一些阅读和实验,并发现了以下奇怪之处:
在查看下面的nm答案之后,我决定将返回的字节写出来,tput
以查看它们与常规ANSI指令的不同之处.
$ echo "$(tput sc)Hello world$(tput rc)G'day" > out.bin $ cat -e out.bin ^[7Hello world^[8G'day$
看起来一切正常,如果我把它的序列ESC
7
和ESC
8
,但如果我把它ESC
[s
和ESC
[u
分别,这是我理解的事情是ANSI SCP和RCP代码(保存光标位置较典型的代表性和还原光标位置, ).由于输入ASCII十进制字符7
或8
在转义的八进制字节表示旁边是不可能的(\0337
!= ESC
),因此可以使用环境变量来避免依赖tput
:
$ esc=$'\033' $ csi="${esc}[" $ echo "${csi}0;31mERROR:${csi}0m It worked." ERROR: It worked. # Color works, as before $ echo "${csi}sHello world${csi}uG'day" Hello worldG'day # No dice $ echo "${esc}7Hello world${esc}8G'day" G'day world # Success
我不确定为什么会这样.如果ESC
7
并且ESC
8
是ANSI SCP和RCP的某种专有或自定义代码,有可能从终端实现到终端实现不同,它会向我解释为什么tput
首先创建.
不幸的是,我无法tput
用于我目前的工作,因为我不是专门在bash环境中工作.我更好奇的是如何从终端到终端解释原始字节,更具体地说,是否有办法让Terminal.app遵守我试过的所有其他终端仿真器的相同ANSI转义码似乎没有问题.那可能吗?在这一点上,我开始认为它可能不是,这很好,但是肯定地知道并且可能还要了解其原因会很好.