Kubuntu:如何禁用“watch”命令输出中的颜色

Kubuntu:如何禁用“watch”命令输出中的颜色

我运行的是 Kubuntu 20.04。

命令 watch 来自包 procps。

dpkg -l procps

显示版本:

2:3.3.16-1ubuntu2

我将 warch 的输出重定向到一个文件,例如

watch -t "date" >/tmp/Wex1

即使未指定监视选项 -d 和 -g,并且与是否指定选项 -c 无关,监视也会写入文件 ESC 序列(可能是 ANSI 颜色序列)。

我在互联网上的某个地方读到,当不输出到终端时,手表会抑制输出中的颜色序列。但就我而言,情况并非如此。

请问有人知道如何防止手表输出 ESC 序列吗?

  • 附录 2022 年 4 月 28 日:

谢谢,但一切都更复杂。

(a) 我能够辨别哪些 ESC 序列用于光标移动,哪些序列用于颜色。我想保留用于光标移动的那个。

(b) watch 的 -c 选项涉及 watch 执行的命令是否向 watch 传递颜色。不是这种情况。

(c) 指令“日期”只是我帖子的一个简短示例。真实的是三个命令链:1. df(在 diff 内,以便与以前的状态进行比较),2. free,3. pmap。如下:

warch -d "df -T -a >/tmp/WEx_df_a__2; diff -U0 /tmp/WEx_df_a__1 /tmp/WEx_df_a__2; echo \"\"; free -h -w; echo \"\"; pmap -X 2205860"

通过管道传输到较少或不。

(d) 通常我通过眼睛观察手表的良好输出。在特殊情况下我想制作准屏幕截图。

另外:由于Konsole提供的Kubuntu终端是/dev/pts/21而不是/dev/tty2,所以screendump和/dev/vcs不可用。

因此,我必须将 watch 的输出写入文件以供文档和解析。

(e) 我已处理手表写入文件的内容以删除颜色序列。

我使用 Internet 中给出的一些正则表达式编写了一个 perl 程序

https::/itectec.com/superuser/removing-ansi-color-codes-from-text-stream

(f) 我的 Perl 脚本不断增长,但尚未完成。由于许多困难,我找不到继续进行的方法:

(f1) 当将我的 perl 脚本的输出直接输出到终端时(在 Kubuntu 中,在 Konsole 中,例如 /dev/pts/21),没有任何显示。仅当将输出通过管道传输到 less 时,才会显示输出,并在 less 的转换中显示不可打印的字符。

(f2) 由于需要使用 less,从 pmap 生成的布局将会丢失,所有单词都是一个以空格作为分隔符的链。

我也喂过

xxd-g1

但现在忘记了。

问候安东

  • 附录 2022 年 4 月 30 日:

谢谢。现在新的认识,都看透了,发现开发人员还有很多事情要做。

(A)

我写的并不完全正确:哪些 ESC 序列用于光标移动,哪些用于颜色。

不用于光标移动的 ESC 序列用于突出显示。这不是通过颜色而是通过反转视频来完成的。

对于反向视频输出,ansi 颜色代码不合适,但其他颜色代码是合适的。

为了解析 watch 的一次性输出,我必须用简单的标记来替换它。

如果值得考虑其他缺陷。

(二)

对于实际使用的终端,用

信息CMP -L -1

人们可以看到终端接受了哪些控制序列

xxd-g1

通过命令 watch 可以看到输出了哪些序列。

手表输出的一些序列未包含在我的终端的 infocmp 列表中。

命令“watch”似乎不是为 xterm-256-color 设计的。

(C)

当 watch 的输出不直接输入到终端而是保存到文件并将文件内容输入到终端时,我遇到了两次失败:

(C1)

终端的设置被破坏。

当我输入 SHIFT-UPARROW 时,显示屏不会移动到一行(正常),但会显示大写字母“A”。

我必须输入“重置”才能恢复。

我发现手表的哪个输出序列是原因:

/e[?1049h\e[22;0;0t

这是手表输出的开始。

(C2)

第二个失败是屏幕上根本没有显示文件内容的任何内容。只有通过管道传输到较少的一个才能检测到输出是否存在。

如果从某个位置删除文件的内容,则可以避免此故障。

我已经找到了位置、原因:

/e[?1049l\e[23;0;0t

问候安东

  • 附录 01.05.2022

我添加以下内容,以便您可以在上下文中看到所有内容。这个故事的开头是我的帖子 10.04.2022 .../questions/698648/...

在这篇文章中,我忘记说给 pmap 命令的 PID 2205860 是什么。这是我在另一个终端运行的主程序的PID,即:

/media/.../wels_fullpath -d / 2>/dev/null | /media/.../wels_fullpath -d / 2>/dev/null | grep -v -e "^fd1" >/tmp/WEx_fullpath_of_slash_ie_mountpoint_of_cow_fs_overlay__unsorted

我的主程序已经运行了很多天,以帮助我分析谁做了什么,因此一夜之间,覆盖文件系统中的许多 GB 被盗。

df -Th -a 已显示

/牛叠加 16G 1.3G 15G 8% /

我最初的问题是“less”的缓冲区在哪里,我已经规避了并且不再使用“less”来解决这个问题。

问候 antondhdih

答案1

编辑:如果没有某种控制序列到文件中,我也无法让手表重定向输出。看将“watch”命令输出为列表寻求解决方法。

只是为了排除由于您的设置而发生的任何奇怪的事情,您可以尝试比较以下输出:

# ESC sequences should be visible. less -R should not output colors ans the output is broken.
watch -t "/bin/ls / --color=always" >/tmp/watch_nocolor.log

# different ESC sequences expected. less -R should show colors but again, broken output.
watch -ct "/bin/ls / --color=always" >/tmp/watch_colorinterpret.log

ls在 Kubuntu 上的行为应该与我的 Lubuntu 实例上的行为相同(我可以在其中重现您的问题)。

也许尝试通过 , 管道传输您所监视的命令catwatch -t 'date | cat' > /tmp/Wex1但它的行为不应有所不同。但是,在整个命令之间放置某个位置可能会产生影响,因为大多数程序应该注意到它们不会输出到终端上。

答案2

watch旨在让您在屏幕上看到命令的不同运行之间的差异。为了定位下一次执行的输出移动光标(使用 ANSI 转义序列)。

据我所知,没有办法删除它。基本上,该程序并不意味着执行您所期望的操作。

另一种选择是使用 shell 循环,因此可以使用:

$ watch -t date >/tmp/Wex1

您可以按照以下方式执行某些操作bash(两次执行之间默认为 2 秒watch):

$ while date; do sleep 2; done >/tmp/Wex1

检查 shell 的循环结构,因为程序中的非零退出代码可能会停止循环(如果您想要的话),具体取决于您放置它的位置。

相关内容