Terminal.app 可以遵循 ANSI 转义码吗?

2024-01-09

我注意到,随着TERM环境变量设置为xterm or xterm-256colorMac OS X 的 Terminal.app 实用程序尊重大多数 ANSI 转义码,至少当这些转义码涉及更改文本颜色时。

例如:

echo -e "\033[0;31mERROR:\033[0m It worked"

生产:

然而,我对 ANSI 转义码提供的光标位置操作功能更感兴趣。很遗憾,that根据我收集到的信息,这种类型的代码在 Terminal.app 中似乎运行得不太好。例如,我want要做的是这样的:

echo -e "\033[sHello world\033[uG'day"

ESC[s保存当前光标位置,而ESC[u恢复上次保存的位置。运行上面的脚本的结果是,在光标重新定位后,我希望“G'day”中的五个字符会覆盖“Hello”的五个字符,从而产生以下结果:

G'day world

事实上,这正是我通过 iTerm2.app、Windows 版 ConEmu(运行 MinGW 或 MSYS Git 的 bash.exe 副本)等得到的结果。然而,我在 Terminal.app 中看到的是:

Hello worldG'day

除了 Terminal.app 缺乏对这些代码的支持之外,还有其他原因吗?有没有办法启用此功能?我是否有可能配置错误?我的学期设置?还有别的事吗?

我一直在到处搜索,但没有找到任何与 Terminal.app 相关的内容。我觉得奇怪的是,它通过 ANSI 转义码支持彩色文本,但不通过完全相同的技术支持光标重新定位。这似乎是一个相当明确的标准的相当任意的子集。这就是让我觉得我配置错误的原因,而不是 Terminal.app 才是罪魁祸首……但是,我想这可能根本无法完成。 (这可能是 iTerm2 存在的首要原因之一?)

如果有人能阐明这种情况,我们将不胜感激!

UPDATE

因此,我做了更多的阅读和实验,发现了以下奇怪的地方:

在查看了下面 n.m. 的答案后,我决定写出由tput到文件以查看它们与常规 ANSI 指令有何不同。

$ echo "$(tput sc)Hello world$(tput rc)G'day" > out.bin
$ cat -e out.bin
^[7Hello world^[8G'day$

如果我向它发送序列,似乎一切都会按预期进行ESC 7 and ESC 8,但如果我发送它就不会ESC [s and ESC [u,据我了解,这是 ANSI SCP 和 RCP 代码(分别是保存光标位置和恢复光标位置)的更典型表示。由于输入了 ASCII 十进制字符7 or 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 and ESC 8是 ANSI SCP 和 RCP 的某种专有或自定义代码,它们可能因终端实现而异,它会向我解释为什么tput首先被创建。

不幸的是,我无法使用tput对于我目前正在做的事情,因为我不仅仅在 bash 环境中工作。我更好奇原始字节如何从终端解释到终端,更具体地说,是否有办法让 Terminal.app 遵守我尝试过的所有其他终端模拟器似乎都没有问题的相同 ANSI 转义码。那可能吗?在这一点上,我开始认为它可能不是,这很好,但最好能确定,并且可能也了解其原因。


不要使用 ANSI 代码。使用正确的基于 terminfo 的技术。基于 Xterm 的终端未指定支持所有 ANSI 代码。有些是为了兼容性,有些则不是。

保存光标位置顺序由下式给出tput sc命令和恢复光标位置是tput rc.

echo -e "$(tput sc)Hello world$(tput rc)G'day"

应该在支持这些序列的任何终端上工作。

要查看支持的序列的可读表示,请使用infocmp命令。输出可能会很长。如果您有兴趣sc and rc:

infocmp | grep --color ' [sr]c='

免责声明:在我的 Linux 机器上进行测试,附近没有 Mac。

UPDATE

Terminal.app 仿照 xterm,而 xterm 仿照 VT100 终端。 VT100未实施CSI u and CSI s序列,但使用 DEC 私有ESC 7 and ESC 8序列(source) http://www.vt100.net/docs/vt100-ug/chapter3.html。后来的 VT 型号同时支持CSI s/u and ESC 7/8,名称不同且功能略有不同(source) http://www.vt100.net/docs/vt510-rm/SCOSC.

ECMA 48 似乎没有指定任何保存/恢复光标位置序列(来源(PDF)) http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf,或者我在那里找不到它们。我不知道在哪里CSU s/u来自。它们在 VT510 文档中的名称表明它们与 SCO 有某种联系。这个来源 http://bjh21.me.uk/all-escapes/all-escapes.txt表明它们实际上是私有序列,没有标准含义。 SUN端子使用SCI s进行重置。将这两个序列标记为 ANSI 可能是错误的。

现代版本的 xterm 和其他 X11 终端程序(konsole、rxvt...)确实支持两者ESC 7/8 and CSI s/u,但terminfo数据库只做广告ESC 7/8。 Terminal.app 显然只支持ESC 7/8.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terminal.app 可以遵循 ANSI 转义码吗? 的相关文章

  • 使用 Applescript 创建一个简单的菜单栏应用程序

    我正在尝试在 OS X Yosemite 中创建一个菜单栏应用程序 它仅包含一个带有子菜单的下拉菜单 该菜单及其子菜单将由 applescript 脚本填充 我之前找到过类似的教程 但它们似乎都相当过时 并且无法在 Xcode 6 2 中正
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • 如何在 mac os 10.6 上安装brew或homebrew

    我已经尝试过多次了 谁能告诉我具体的详细步骤吗 我的Mac操作系统是10 6 8 它抱怨一些丢失的包裹 使用它在 Mac OSX 10 6 8 上安装 ruby e curl fsSL https raw githubusercontent
  • 从内存加载动态库

    是否可以从内存而不是从 mac gcc 上的文件系统加载库 在 Windows 中 我使用 MemoryModule 但它显然不跨平台兼容 首先 要做到这一点 我建议您阅读OS X ABI 动态加载器参考 https developer a
  • 更新 Mac OS 10.7 的 grep

    我想将 Mac 上的 grep 更新到比 Mac OS 10 7 2 附带的 2 5 1 更新的版本 我的问题是 为 Mac 更新 grep 或任何类似程序 的最佳方法是什么 我可以使用 Fink 或 MacPorts 安装新版本并设置路径
  • 由于 Xcodebuild,终端在每个命令上都停止运行

    我刚刚将 Xcode 更新到 11 4 突然间我的终端 iTerm 3 3 9 变得非常慢 键入命令效果很好 但在按下 Enter 后 我经常等待 3 4 秒才能执行一个简单的任务 cd git add etc 当我查看状态栏时 我注意到x
  • Apache PHP/OSX Mavericks: - 无法打开流:打开的文件太多

    我最近升级到 OSX Mavericks 从那时起 我开始在我的开发计算机上收到上述错误 代码中没有明显的问题 它是自动生成的Yii http www yiiframework com 示例应用程序 Mavericks 升级过程中发生的事情
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • 如何在 Mac 上使用 Process.Start() 或等效的 Mono 并传入参数

    我正在尝试编写一些 C 代码来启动浏览器Process Start app args 其中 apps 是浏览器的路径 例如 Applications Google Chrome app Contents MacOS Google Chrom
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • 向上移动箭头不突出显示文本 emacs iterm2

    我最近有人帮忙修复M left等等 终端元箭头键绑定中的 emacs https stackoverflow com questions 10867199 emacs in terminal meta arrow keybindings 但
  • 在 Cocoa OS X AVPlayer 中播放 HLS (m3u8) - Swift

    基本上我正在尝试在 Cocoa Swift 中使用 AVPlayer 播放 m3u8 HLS Live Stream 我对这门语言比较陌生 所以基本上掌握了一些示例代码 http qiita com ono matope items 23d
  • 在 OS X 上创建和使用静态库

    好的 我正在尝试创建一个 Cocoa 库 静态 并使用 但我不断收到错误 我创建了一个超基本的静态库 TSXLib 其中仅包含一个额外的类 import
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 在 Mac 操作系统上使用 ffmpeg 录制视频

    我想在 mac OS 上使用 ffmpeg 以任何格式录制实时网络摄像头视频 我尝试了很多 但无法找到用于重新编码视频的命令 所以请任何人都可以告诉我 ffmpeg 命令用于使用 Mac 操作系统的网络摄像头捕获视频 提前致谢 对于 Mac
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • 在 MAC OS X 10.9 上安装 NLTK 确实很困难

    我是 Python Mac OS 新手 我正在寻找 NLTK 教科书 但我在安装它时遇到了一些问题 我一直在寻找解决方案 但不幸的是 所有解决方案似乎都不适合我 或者我误解了如何使用它们 我遇到的基本问题是 尽管按照说明进行操作 NLTK
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的

随机推荐

  • 尝试在 Chrome 中加载仪表板页面时避免使用 document.write()

    所以我在这个问题上停留的时间比我愿意承认的要长 但作为一个 Angular 新手 我完全感到困惑 因此 我正在遵循一些在线教程 以便将 Gulp 实现到我正在开发的应用程序中 每当我运行 Gulp 任务时 我都会在 Chrome 中收到错误
  • 代码中奇怪的 constexpr 参数

    我试图理解代码 include
  • Bash 脚本、git 和带空格的文件名

    我正在尝试使用 bash 脚本自动化与 git 的一些交互 为此 我有一个脚本 它将通过 ssh 并列出所有存储库 然后克隆它们 部分脚本如下所示 DIRS ssh u ls p for DIR in DIRS do echo ssh u
  • C# 如何连接到 MS Access 2007

    我在连接到 MS Access DB 2007 时遇到问题 代码 private void btnSave Click object sender EventArgs e OleDbConnection Conn new OleDbConn
  • SQL 中纪元转换为日期时间

    我提供了一个 SQL 函数 可以将纪元转换为日期时间 这个sql函数的问题不起作用适用于 1970 年 1 月 3 日之前的日期 有没有人有任何想法可以使其适用于 1970 年以内的日期 DECLARE total bigint if gr
  • 如何使用 QML 创建启动屏幕

    我正在尝试使用 QT 开发 Android 应用程序 我想在应用程序启动时显示启动屏幕 启动画面将停留 2 秒钟 然后将显示应用程序的主页 为此 我创建了 2 个 qml 文件 启动画面 qml import QtQuick 2 9 imp
  • ImageMagickError 无法读取字体“(null)”:“(null)”

    我在生产服务器 运行 ImageMagick Rmagick 等的 Ubuntu 上遇到此错误已经有一段时间了 从谷歌搜索看来 似乎找不到合适的字体来使用 这需要在 sudo nano usr lib ImageMagick 6 3 7 c
  • Connect 会话中间件签名 cookie 如何工作?

    我想了解 connect sid cookie 在 Connect Node js 框架中如何工作 我注意到它们的格式如下 s hash signature 我不明白当哈希足以用于从内存存储或 Redis 存储访问会话数据时如何使用签名 另
  • Azure 密钥保管库:访问被拒绝

    我有以下代码用于从 Azure 密钥保管库获取机密 public static async Task
  • 与数据库无关的应用程序的数据库设计

    我必须考虑什么在数据库设计中对于一个新的应用程序来说 哪些应该能够支持最常见的关系数据库系统 SQL Server MySQL Oracle PostgreSQL 值得付出努力吗 有哪些陷阱 简而言之 答案是坚持标准或接近标准实现的功能 更
  • 缓存过期控制与上次修改

    在阿帕奇的mod expires模块 有Expires具有两个基准时间段的指令 access and 修改 ExpiresByType text html access plus 30 days 可以理解 这意味着缓存将在 30 天后请求新
  • 如何在 PHP 中将指数转换为小数

    我有一个像这样的字符串 9 018E 14 现在我想将其转换为正常的十进制数 我的极客伙伴 http www mygeekpal com how to convert exponentials to decimals in php 有一篇关
  • MySQL 连接器、流式结果集和批量获取

    我正在浏览 MySQL Connector 5 1 24 源代码 我注意到该方法中有一些不寻常的地方StatementImpl createStreamingResultSet javadoc 说 我们仅在结果集是只进 只读和 获取大小已设
  • 如何在 iPhone 上使用 Quartz/Core Graphics 显示国际口音

    我已经本地化了一个适用于 iPhone 的应用程序 毫不奇怪 本地化包括一些口音 触摸卡片进行选择 然后触摸 出价 Touchez les cartes pour les 选择者 puis touchez 守财奴 这些在高级的东西中工作得很
  • 将 UTC 纪元转换为本地日期

    我已经为此奋斗了一段时间了 我正在尝试将纪元转换为日期对象 该纪元以 UTC 格式发送给我 每当你经过new Date 一个纪元 它假设它是本地纪元 我尝试创建一个 UTC 对象 然后使用setTime 将其调整到正确的纪元 但似乎唯一有用
  • 在 R 中创建表达式树

    中的替代函数R以可以解析的树的形式创建一个语言对象 如何使用 list 从头开始 创建树 然后将其交给 eval substitute gives a tree representation of the expression a 1 b
  • 如何在 ASP.NET 3.5 中对每个 http 请求进行缓存

    我们使用 ASP NET 3 5 基于控件的方法 并且只需要特定于一个 http 请求的存储 使用会话 id 中的键的线程特定缓存将不起作用 因为线程应该被池化 因此我有机会在缓存中获得来自某些先前请求的数据 这在我的情况下是不可取的 我总
  • 在python中组合两个循环

    假设有两个多边形 p1 和 p2 其中 p2 完全在 p1 内部 p1 0 10 10 10 10 0 0 0 p2 2 6 6 6 6 2 2 2 degree of contact 0 xyarrays p1 p2 p1 degree
  • asp.net 中的 GridView 标题文本

    我想使用 Design 更改 gridview 的标题文本
  • Terminal.app 可以遵循 ANSI 转义码吗?

    我注意到 随着TERM环境变量设置为xterm or xterm 256colorMac OS X 的 Terminal app 实用程序尊重大多数 ANSI 转义码 至少当这些转义码涉及更改文本颜色时 例如 echo e 033 0 31