为什么文件名中的 unicode 会导致“find”将输入添加到终端?

为什么文件名中的 unicode 会导致“find”将输入添加到终端?

所以我有以下带有奇怪 Unicode 名称的文件。当我find对文件执行命令时,它会将输入打印到终端。62;c在输出的底部查找。为什么会发生这种情况?这是一个错误还是故意的?当我尝试使用文件名进行制表符补全时,我也得到了一些类似的输出。

jeff@laptop:/tmp/x$ ls
057. Antonâ??â? n Dvoâ??ôâ??°k - Rusalka - MÆ?õsâ??â? Æ?çku Na Nebi Hlubokâ??©m.mp3
jeff@laptop:/tmp/x$ find
.
./057. Antonâ??â? n Dvoâ??ôâ??°k - Rusalka - MÆ?õsâ??â? Æ?çku Na Nebi Hlubokâ??©m.mp3�©m.mp3
jeff@laptop:/tmp/x$ 62;c

ls -ab 显示以下内容:

057.\ Antonâ\302\210\302\232â\302\211 n\ Dvoâ\302\211\302\210ôâ\302\210\302\232°k\ -\ Rusalka\ -\ MÆ\302\222õsâ\302\210\302\232â\302\211 Æ\302\222çku\ Na\ Nebi\ Hlubokâ\302\210\302\232©m.mp3

另一条信息。我在“终端”中看到文本,但在“xterm”中看不到。

答案1

某些转义序列会向终端(或终端仿真器)查询某些参数(例如版本、功能、当前状态)。根据设计,这些转义序列只能通过将响应作为转义序列发送来回答就像用户输入的一样

要尝试一下,请执行例如

 echo -ne '\e[c'; sleep 100

并看到^[[?62;c(即ESC后跟文字[?62;c)出现,并在sleep运行时使用退格键将其删除,正是就像你输入这。

此特定转义序列的替代形式,使用 C1 控制代码而不是默认的 C0,只有一些终端仿真器如果使用 UTF-8 则为:

echo -ne '\xC2\x9Bc'; sleep 100

(见开头ctlseqs.html为什么 xterm 不支持这些。)

任何发出此类转义的应用程序都应等待响应并采取相应措施。否则,它们应足够小心,不要产生此类输出。

对我来说(Ubuntu 18.04),find可以识别这两个并将它们替换为问号,以确保它们不会按原样发送到终端。您可能find在较旧的 Ubuntu 中使用较旧的版本,它尚未正确过滤掉这些,或者您可能遇到了未过滤掉的不同转义序列(在后一种情况下,我们应该针对提交错误报告findutils)。我们需要知道精确的文件名 (精确的字节序列)继续调查。

更新:我刚刚发现并提交了一个相关的错误:https://savannah.gnu.org/bugs/?54236。不确定您是否击中了此点。

相关内容