【发布时间】:2016-10-11 14:34:48
【问题描述】:
我有一个 Java 应用程序,它使用 ANSI escape sequences 来显示颜色、定位光标等。
在常规 Unices 下运行良好,
以及在xterm 和mintty(在Cygwin 中)下,
但我无法在cygwin 终端下运行它(即从cmd.exe 启动的bash)。
从屏幕截图中可以看出:
转义序列“按原样”输出,无需处理。另一方面,我可以像echo -e '\033[1;31mTest' 这样轻松地运行smth -- 并且彩色文本就在那里。
同时,如果我从Midnight Commander 子shell 启动完全相同的应用程序,应用程序产生的转义序列将被正确解释:
另外,如果我使用 SSH 登录到我的 Windows 机器(即用远程连接替换本地连接,但保留相同的 cygwin 终端),同样,转义序列处理得很好。
看起来当创建某种子shell(mc 或ssh)时,终端会进入其他模式。但是使用stty 并没有帮助,导出TERM=ansi 也没有帮助。
有人可以提出任何解决方案吗?
我在跑步
CYGWIN_NT-6.3 UNIT-725 2.5.1(0.297/5/3) 2016-04-21 22:14 x86_64 Cygwin
和 Windows 8.1。
【问题讨论】:
-
我很确定,如果您从 cmd.exe 启动 Cygwin 的 bash,它将继续使用 Windows 提供的控制台窗口,而不是创建自己的控制台窗口。最新版本的 Windows 10 中的控制台支持 ANSI 转义序列(尽管我相信它必须显式打开),但以前的版本不支持。我不知道是否有任何方法可以使这项工作。您最好的选择可能是提供一个启动器,以正确的方式启动您的应用程序。
-
...虽然
echo工作的事实表明Cygwin 有某种翻译层。如果您以某种方式通过 Cygwin 提供输出,那可能会起作用。也许是一个 bash 脚本,它可以重定向进程的输出并将其回显到控制台?或者基于 Cygwin 的 Java 解释器,如果有的话。 -
@HarryJohnston 的重点是,
bash.exe在作为cmd.exe的直接子级运行时已经说过翻译层(转义序列-> Win32 API 控制台调用)。问题是为什么上述翻译有时有效,有时无效。 -
输出并没有通过
bash.exe,而是直接从Java 到控制台。echo工作的原因是它是一个 Cygwin 应用程序,有自己的翻译层,它与你是否从 bash 运行它无关。 (即使在 Linux 上本地运行时,bash 也不会拦截其子级的输出;为什么会这样?)
标签: java windows cygwin ansi-escape