'watch' 没有解释隐含的 'reset' 颜色代码 `^[m`
'watch' is not interpreting the implicit 'reset' color code `^[m`
看来 watch
没有解释隐含的 'reset' 颜色代码 ^[m
。它确实解释了 explicit 代码 ^[0m
.
有谁知道如何解决这个问题?或者这听起来像是一个错误,我需要联系 watch
的维护者?
我为什么要问:
我将 watch
与 git log
一起使用,git log
使用隐式重置 ^[m
。
示例:
$ watch -c git log --oneline --decorate --source --graph --color=always
它应该是这样的:
$ git log --oneline --decorate --source --graph --color=always
调查
如果我们不在 watch
上包含 -c
(--color
) 选项,我们可以看到那里有 ANSI 转义码:
Every 2.0s: git log --oneline --decorate --source --graph --color=always Fri Sep 28 08:17:42 2018
* ^[33m9db218b^[m HEAD^[33m (^[m^[1;36mHEAD^[m^[33m -> ^[m^[1;32mmaster^[m^[33m, ^[m^[1;33mtag: v0.8.0b5^[m^[33m, ^[m^[1;31morigin/master^[m^[33m, ^[m^[1;31morigin/HEAD^[m^[33m)^[m Doc updates for v0.8.0b5 release
* ^[33mfd342d9^[m HEAD Update changelog [ci skip]
* ^[33md1af865^[m HEAD Update changelog
* ^[33m70889fa^[m HEAD Merge branch 'testing-updates' into 'master'
上面的例子有很多内容 - 让我们简化一下:
证明我们正在正确转义:
$ echo -e "3[33myellow3[mnormal"
发送至watch
注意:echo
上的 -e
arg 未被解析,因为我们引用了一些东西。 watch
现在处理颜色代码。
$ watch -c 'echo -e "3[33myellow3[mnormal"'
从 watch
中删除 -c
标志
$ watch 'echo -e "3[33myellow3[mnormal"'
Every 2.0s: echo -e "3[33myellow3[mnormal" Fri Sep 28 08:29:26 2018
-e ^[33myellow^[mnormal
这看起来符合预期。
使用显式 ^[0m
重置代码有效
$ watch -c 'echo -e "3[33myellow3[0mnormal"'
版本
主要在 WSL 下测试:Window 10 Pro,v1803,build 17134.286
$ watch -v
watch from procps-ng 3.3.10
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenial
$ uname -a
Linux redacted-hostname 4.4.0-17134-Microsoft #285-Microsoft Thu Aug 30 17:31:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux
$ git --version
git version 2.7.4
还在 linux 机器上使用 PuTTY 进行了测试。版本信息同上,只是没有使用WSL。
看起来它已在 procps
的 3.3.12 版中修复,其中包含 watch
:
https://gitlab.com/procps-ng/procps/issues/12
https://gitlab.com/procps-ng/procps/commit/6fcb690099bd681930946492e8a93c61e82249d8
看来 watch
没有解释隐含的 'reset' 颜色代码 ^[m
。它确实解释了 explicit 代码 ^[0m
.
有谁知道如何解决这个问题?或者这听起来像是一个错误,我需要联系 watch
的维护者?
我为什么要问:
我将 watch
与 git log
一起使用,git log
使用隐式重置 ^[m
。
示例:
$ watch -c git log --oneline --decorate --source --graph --color=always
它应该是这样的:
$ git log --oneline --decorate --source --graph --color=always
调查
如果我们不在 watch
上包含 -c
(--color
) 选项,我们可以看到那里有 ANSI 转义码:
Every 2.0s: git log --oneline --decorate --source --graph --color=always Fri Sep 28 08:17:42 2018
* ^[33m9db218b^[m HEAD^[33m (^[m^[1;36mHEAD^[m^[33m -> ^[m^[1;32mmaster^[m^[33m, ^[m^[1;33mtag: v0.8.0b5^[m^[33m, ^[m^[1;31morigin/master^[m^[33m, ^[m^[1;31morigin/HEAD^[m^[33m)^[m Doc updates for v0.8.0b5 release
* ^[33mfd342d9^[m HEAD Update changelog [ci skip]
* ^[33md1af865^[m HEAD Update changelog
* ^[33m70889fa^[m HEAD Merge branch 'testing-updates' into 'master'
上面的例子有很多内容 - 让我们简化一下:
证明我们正在正确转义:
$ echo -e "3[33myellow3[mnormal"
发送至watch
注意:echo
上的 -e
arg 未被解析,因为我们引用了一些东西。 watch
现在处理颜色代码。
$ watch -c 'echo -e "3[33myellow3[mnormal"'
从 watch
中删除 -c
标志
$ watch 'echo -e "3[33myellow3[mnormal"'
Every 2.0s: echo -e "3[33myellow3[mnormal" Fri Sep 28 08:29:26 2018
-e ^[33myellow^[mnormal
这看起来符合预期。
使用显式 ^[0m
重置代码有效
$ watch -c 'echo -e "3[33myellow3[0mnormal"'
版本
主要在 WSL 下测试:Window 10 Pro,v1803,build 17134.286
$ watch -v
watch from procps-ng 3.3.10
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenial
$ uname -a
Linux redacted-hostname 4.4.0-17134-Microsoft #285-Microsoft Thu Aug 30 17:31:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux
$ git --version
git version 2.7.4
还在 linux 机器上使用 PuTTY 进行了测试。版本信息同上,只是没有使用WSL。
看起来它已在 procps
的 3.3.12 版中修复,其中包含 watch
:
https://gitlab.com/procps-ng/procps/issues/12
https://gitlab.com/procps-ng/procps/commit/6fcb690099bd681930946492e8a93c61e82249d8