ANSI 转义序列在运行 Ruby 脚本以输出到 Geektool 时消失



我正在尝试使用OS X应用程序GeekTool将彩色文本输出打印到我的桌面上。 GeekTool允许您将称为"geeklets"的小窗口放置在桌面上。 一种Geeklet显示shell命令的输出。

想要的输出应该来自我正在使用 ruby 脚本解析的文本文件。 我正在使用红宝石着色在 Ruby 中的字符串周围添加 ANSI 转义序列。 我的目标是将这些字符串输出到 Geektool 并显示彩色文本。

当我在终端(终端和 iTerm2,同时使用 zsh 和 bash)中运行 Ruby 脚本时,输出的颜色非常好。 但是当我在GeekTool中运行脚本时,它不是 - 转义序列没有显示在输出中,但没有颜色。 我知道GeekTool支持ANSI转义序列,因为当我运行这个shell命令时:

printf "e[0;35;49mabcde[0m"

我得到彩色的极客工具输出。 echo $SHELL还告诉我,GeekTool正在使用我通常使用的相同zsh可执行文件。 但由于某种原因,我的红宝石脚本不会打印彩色输出。 相反,我看到的是单色输出,但剥离了转义序列。

我的脚本使用 Ruby 的puts输出包含转义序列的字符串。 我尝试切换到p. 在终端中运行时,这将产生非彩色输出,转义序列完好无损。 在GeekTool中运行时,我也得到了非彩色输出,但转义序列再次消失了。

有谁知道我的逃生序列要去哪里?

我找到了解决此问题的方法。 我需要丢弃彩色宝石并"双重逃逸"逃逸序列。 我通过用如下所示的字符串包裹字符串来着色:

"\e[0;36;49m"  # example color
"\e[0m"        # clear

在构建了一个包含许多转义序列的大字符串后,我做了

command = "printf "#{mystring}n""  # The trailing n is needed to prevent Geektool from displaying [m at the end for some reason
exec(command)

这成功了。 似乎字符串在输出到 Geektool 时以某种方式被处理了两次。 逃生\e前面需要双反斜杠,以防止它们在第一次通过时被消耗。

相关内容

  • 没有找到相关文章