如何在打印某些十六进制值时避免 Bash printf 错误:输入/输出错误

如何在打印某些十六进制值时避免 Bash printf 错误:输入/输出错误

我正在使用printf命令巴什在 Ubuntu 上的 WSL 下。

我正在尝试使用这个记录的语法

\xHH 十六进制值 HH 的字节(1 到 2 位数字)

这适用于printf "\x0A"(回车)和许多其他值。

但不适用于printf "\xFF"printf "\xFE"我想用来在将 Utf-16 文件(但没有 bom)的内容通过管道进行某些处理之前注入 BOM Utf-16 前缀。

对于这个值(包括过去的 0xF8),我收到错误:

-bash: printf: 写入错误:输入/输出错误

答案1

感谢@Steeldriver 最初复制了此内容。我自己无法做到(至少一开始不能),但你和 Steeldriver 都确认了这一点,这让我可以更深入地挖掘。

这似乎是报告中所报告的行为的表现这个 Github 问题。该问题已被关闭,因为这并不是特定的 WSL 问题,而可能是旧版 Windows 控制台主机中的问题。

控制台主机是“旧的”Windows 终端界面,至少可以追溯到二十年前。我不知道这个问题是否曾被报告过,但无论如何它都不太可能得到解决。

Windows Console Host 正在被 Windows Terminal 取代,Windows Terminal 是 Microsoft 开发的一种(相对)新的开源终端,具有现代终端功能。它目前可以作为 Windows 11 上的默认终端运行。它也可以在 Windows 10 上运行(只是不是默认终端)。

我已经确认该问题不会出现在 Windows 终端上。

由于 Github 问题是在 WSL2 发布之前出现的,这让我有一种预感,为什么 Steeldriver 只在一个系统上看到它,而我最初没有看到它。有趣的是,这个问题(至少对我来说)仅有的发生在 WSL1 中,而不是 WSL2 中。这意味着触发它的 WSL1 中的系统调用转换接口可能存在一些不兼容性。 WSL2 的 Linux 内核不存在该问题。

所以要解决,要么:

  • 使用 Windows 终端(或 Windows 上的任何非控制台主机终端)
  • 或者使用 WSL2 实例。

前者是我的偏好,因为你可以继续使用两个都WSL1 和 WSL2 同时利用升级后的 Windows 终端的功能。

相关内容