为什么 showconsolefont 在 tmux 中有不同的输出?

Chr*_*don 5 arch-linux tmux fonts tty

我正在运行一个没有窗口管理器或桌面环境的 arch Linux 系统(现在)。当我需要多个终端时,我使用 tmux。当我在 tty 上运行sudo showconsolefont(没有 tmux)时,我看到了预期的符号集,但是当我打开 tmux 并运行时sudo showconsolefont,我看到了一组重复的不同符号。

我的字体是ter-124b,来自 Terminus 系列。

在屏幕截图中,顶部输出是从 tmux 中捕获的,看起来与我运行时的显示方式相同sudo showconsolefont。底部输出包含不同的符号,但如果我将其重定向到一个文件,然后再重定向到cat该文件,它们看起来是相同的。diff分析它们还报告说它们是相同的。

为什么 tmux 中 showconsolefont 的输出不同?我认为该命令的重点是以当前字体显示所有可用符号。由于我在 tmux 内部和外部使用相同的字体,所以我不明白为什么有什么区别。我确信我在这里缺少一些简单的 Linux 字体概念。有人可以向我指出吗?

我尝试检查我是否在 tmux 中的值$TERM并确保它默认为linux(与我的 tty 中相同$TERM),但这没有任何区别。( set -g default-terminal "linux")

Tho*_*key 4

简短:tmux无法以字体显示所有 256 个项目

\n\n

长的:

\n\n

请参阅源代码,这有点尴尬,因为(请参阅KBD \xe2\x80\x93 Linux 键盘工具网页)更喜欢 tarball,但您可以使用 git-cloning 建议来浏览源代码。该showconsolefont程序执行此操作

\n\n
    \n
  • 打开指定的设备,
  • \n
  • 验证它是一个控制台
  • \n
  • 获取当前模式,查看是否使用 UTF-8,
  • \n
  • 使一个虚拟的(琐碎的)屏幕地图
  • \n
  • 获取当前屏幕地图
  • \n
  • 打印数组...
  • \n
  • 对于每一行,它重新映射数组中的字符以显示字体
  • \n
  • 恢复控制台的模式和屏幕映射
  • \n
\n\n

之所以showconsolefont可以显示 256 个项目(而不是说 256 - 32 个控制字符)是因为它重新映射了直接发送到控制台的代码。实际上这将是33 个控件,因为0x9b处理方式不同。足够接近。 showconsolefont正在编写看似可打印的字符,但正在逐行更改实际绘制的字符。

\n\n

您可能注意到的一件事是,对控制台设备的所有更改都使用实际设备的文件描述符,而字符数组则写入标准输出。当您在 tmux外部运行此程序时,它们是相同的设备。但是在内部 tmux运行,标准输出是到不同的设备(伪终端,它将特殊映射与字符分开。如果将 shell 重定向到控制台,例如,

\n\n
$ tmux\n$ sudo su -\n# exec >/dev/console\n# showconsolefont\n
Run Code Online (Sandbox Code Playgroud)\n\n

你将能够看到部分有趣的角色。但伪终端不会按预期显示回车/换行,并且状态行tmux可能无法正确绘制:

\n\n

在 tmux 内重定向 showconsolefont

\n\n

与(外部tmux):

\n\n

普通显示控制台字体

\n\n

可能有一种方法可以设置 root 的终端模式以获得可读输出,但这不是或者showconsolefont不需要tmux做一些工作就可以做到的。

\n