我正在编写一些代码,其中 MATLAB 查询 Git 标签:
[status, cmdout] = system("TERM=xterm; git tag -l")
在我最初编写代码的 Windows 11 分区上,这工作正常,我得到了一个以换行符分隔的标签列表。然而,在我的 Ubuntu 分区上,命令输出是
'[?1h=
mytag[m
[K[?1l>'
(
mytag
是唯一存在的标签。在W11上,输出只是mytag
)
解码后,显然是
'\x1B[?1h\x1B=\x13mytag\x1B[m\x13\x10\x13\x1B[K\x1B[?1l\x1B>'
或
'<ESC>[?1h<ESC>=\rmytag<ESC>[m\r\n\r<ESC>[K<ESC>[?1l<ESC>>'
我发现这些
<ESC>[...
序列是用于格式化和文本颜色的转义序列。其中大多数是 ANSI 转义序列,但是 <ESC>=
和 <ESC>>
似乎是 XTerm 特定的。
起初我以为
bash
和 cmd
将输出返回到 MATLAB* 的方式不同,但我通过编写自己的程序来测试这一点,该程序用彩色字体打印“hello, world”并从 MATLAB 调用它在这两种操作系统中,ANSI 序列也按字面意思显示在 Windows 上。所以看起来是 Git 的行为不同,尽管它可能是其他东西。
我已经开始研究正则表达式来删除所有这些内容,但是 Git 插入的所有回车符破坏了我的一堆代码(它使用了许多 Git 命令。不要问为什么),我想我'除非我弄清楚如何让 Git 打印出与 Windows 上相同的简单输出,否则最终会创建一些非常脆弱且丑陋的代码。 如果我没有在 Git 命令前添加
TERM=xterm
前缀,则默认终端模式为 dumb
,您会 认为 正是我想要的。但是,如果您这样做,Git 会打印出警告
WARNING: terminal is not fully functional
Press RETURN to continue
并且看起来 MATLAB
system
命令无法用于回答此提示,而且该提示仅出现在某些命令上,最后 Git 仍然在 git tag -l
中包含一个 ANSI 序列(以及那些该死的换行符)
即使我使用哑模式也会输出,所以无论如何都没用。
那么 - 是否可以阻止 Git 打印除纯文本之外的任何内容,但不需要手动确认某些命令?为什么所有这些在 Windows 上都能如此轻松地完成 - Git 是否有问题? 非常欢迎任何有关为什么我在 Ubuntu 和 Windows 之间出现不同行为的解释、解决此问题的更好方法或任何可能有帮助的内容。
* 这就是它的工作原理,对吗?
system
启动 bash
/cmd
进程,向其提供命令字符串,然后收集其输出?
我会使用
--no-color
选项:
[status, cmdout] = system("git tag -l --no-color")