我正在尝试使用OS X应用GeekTool将彩色文本输出打印到我的桌面上。 GeekTool允许您将名为“geeklets”的小窗口放在桌面上。一种Geeklet显示shell命令的输出。
我想要的输出应来自我使用ruby脚本解析的文本文件。我正在使用ruby gem colorize在Ruby中的字符串周围添加ANSI转义序列。我的目标是将这些字符串输出到Geektool并显示彩色文本。
当我在终端(终端和iTerm2,同时使用zsh和bash)中运行Ruby脚本时,输出完美地着色。但是当我在GeekTool中运行脚本时,它不是 - 输出中没有显示转义序列,但没有颜色。我知道GeekTool支持ANSI转义序列,因为当我运行这个shell命令时:
printf "\e[0;35;49mabcd\e[0m"
我获得了彩色GeekTool输出。 echo $SHELL
还告诉我,GeekTool使用的是我通常使用的zsh可执行文件。但由于某种原因,我的ruby脚本不会打印彩色输出。相反,我看到的是单色输出,但剥离了转义序列。
我的脚本使用Ruby的puts
输出包含转义序列的字符串。我尝试切换到p
。当在终端中运行时,这会产生非彩色输出,并且转义序列保持不变。在GeekTool中运行时,我也获得了非彩色输出,但转义序列再次消失。
任何人都知道我的逃生序列在哪里?
答案 0 :(得分:4)
我找到了解决此问题的方法。我需要删除彩色宝石并“双重逃脱”转义序列。我用一个字符串包裹着它,如下所示:
"\\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
前面使用双反斜杠,以防止它们在第一次传递时消耗掉。