我正在使用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 终端的功能。