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

xv8emn3q  于 2023-04-05  发布在  Ruby
关注(0)|答案(1)|浏览(99)

我尝试使用OS X应用程序GeekTool将彩色文本输出打印到桌面上。GeekTool允许您将称为“geeklets”的小窗口放置到桌面上。一种Geeklet显示shell命令的输出。
我想要的输出应该来自一个文本文件,我正在用ruby脚本进行解析。我正在使用ruby gem colorize来添加Ruby中字符串的ANSI转义序列。我的目标是将这些字符串输出到Geektool并显示彩色文本。
当我在terminal中运行Ruby脚本时(包括Terminal和iTerm 2,同时使用zsh和bash),输出的颜色非常好。但是当我在GeekTool中运行脚本时,它不是-输出中没有显示转义序列,但是没有颜色。我知道GeekTool支持ANSI转义序列,因为当我运行这个shell命令时:

printf "\e[0;35;49mabcd\e[0m"

我得到了彩色的GeekTool输出。echo $SHELL还告诉我GeekTool使用的是我通常使用的zsh可执行文件。但由于某种原因,我的ruby脚本不会打印彩色输出。相反,我看到的是单色输出,但转义序列被剥离。
我的脚本使用Ruby的puts来输出包含转义序列的字符串。我尝试切换到p。当在终端中运行时,这会产生非彩色输出,转义序列完好无损。当在GeekTool中运行时,我也会得到非彩色输出,但转义序列再次消失。
有人知道我的转义序列在哪里吗?

2vuwiymt

2vuwiymt1#

我找到了一个解决这个问题的方法。我需要删除着色的gem并对转义序列进行“双重转义”。我通过用下面的字符串 Package 字符串来为字符串着色:

"\\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前面加上双反斜杠,以防止它们在第一次传递时被消耗。

相关问题