Почему юникод в имени файла заставляет 'find' добавить ввод в терминал?

Итак, у меня есть следующий файл со странным юникодным именем. Когда я выполняю команду 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».

0
задан 5 July 2018 в 06:14

1 ответ

Определенные escape-последовательности запрашивают у терминала (или эмулятора терминала) определенные параметры (такие как версия, функции, текущее состояние). Они, по замыслу, могут ответить только путем отправки ответа в качестве escape-последовательности , как если бы он был набран пользователем .

Чтобы попробовать, выполните, например,

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

и см. ^[[?62;c (т. Е. ESC, за которым следует литерал [?62;c) и возврат на него, стирающий его во время работы sleep, в точности , как если бы вы набрали this.

Альтернативная форма этой конкретной escape-последовательности, использующая управляющий код C1, а не C0 по умолчанию, который поддерживается только некоторыми эмуляторами терминала , если используется в UTF-8, является:

[ 111]

(см. Начало ctlseqs.html , почему xterm не поддерживает их.)

Ожидается, что любое приложение, генерирующее такой escape, будет ждать ответа и действовать в соответствии с ним. соответственно. В противном случае они должны быть достаточно осторожны, чтобы не производить такой вывод.

Для меня (Ubuntu 18.04), find распознает оба из них и заменяет их вопросительными знаками, чтобы убедиться, что они не отправлены на терминал как есть. Возможно, вы используете более старую версию find в более старой Ubuntu, которая еще не отфильтровала их должным образом, или вы можете столкнуться с другой escape-последовательностью, которая не отфильтрована (в этом последнем случае мы должны подать отчет об ошибке против findutils). Нам нужно знать точное точное имя имени файла ( точная последовательность байтов), чтобы продолжить расследование.

ОБНОВЛЕНИЕ: Я только что обнаружил и подал соответствующую ошибку: https://savannah.gnu.org/bugs/?54236 . Не уверен, что вы попали в этот.

0
ответ дан 5 July 2018 в 06:14

Другие вопросы по тегам:

Похожие вопросы: