Я думаю, что bash запутывается из-за некоторых аномалий в том, как обрабатываются акцентированные символы. Вы могли бы хотеть захватить немного попкорна, потому что это собирается стать техническим для немного ...
Юникод позволяет отображать некоторые акцентированные символы несколькими различными способами: в виде «кодовой точки», представляющей акцентированный символ, или в виде последовательности кодовых точек, представляющих безударную версию символа, за которой следует акцент (ы). Например, «ä» может быть представлен либо предварительно составленным как U + 00E4 (UTF-8 0xc3a4, латинская строчная буква 1 с диарезом), либо разложенным как U + 0061 U + 0308 (UTF-8 0x61cc88, латинская строчная буква a +, сочетающим диарез ).
Файловая система OS X HFS + требует, чтобы все имена файлов были сохранены в представлении UTF-8 их полностью разложенной формы . В имени файла HFS + «ä» ДОЛЖЕН быть закодирован как 0x61cc88, а «ö» ДОЛЖЕН быть закодирован как 0x6fcc88.
Я почти уверен, что здесь происходит то, что когда вы набираете «Näyttökuva.png» в командной строке, он «печатает» символы в заранее составленном виде. Когда файл создан, файловая система разлагает символы для хранения. Пока все хорошо. Но когда вы пытаетесь использовать завершение табуляции, начинающееся с «Nä», я думаю, что bash не может разложить «ä» перед поиском совпадений, и, конечно, он не находит их.
Чтобы проиллюстрировать разницу, вот пример того, какая кодировка используется, когда я просто набираю «Näyttökuva.png» в командной строке, по сравнению с тем, что используется, когда я сохраняю его как имя файла и использую завершение табуляции для его заполнения:
$ printf Näyttökuva.png | xxd # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67 N..ytt..kuva.png
$ touch Näyttökuva.png # Also pasted from the web
$ printf Näyttökuva.png | xxd # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70 Na..ytto..kuva.p
0000010: 6e67 ng
Теперь, что касается потери символов при удалении и повторном завершении табуляции, я подозреваю, что это тесно связано. В частности, я думаю, что bash «удаляет» одну кодовую точку за нажатие клавиши удаления, но стирает один символ из окна терминала за нажатие. Поскольку один из удаленных символов (на этот раз «ö») состоял из двух кодовых точек, но только из одного символа, дисплей терминала не синхронизирован. Попробуйте завершить табуляцию всего имени файла, удалив его обратно в «Näytt», а затем повторно завершить табуляцией: bash, похоже, думает, что был удален только комбинированный диарез, а не весь «ö», поэтому он повторно добавляет комбинирующий диарез , но на этот раз он прикрепляется к «т»:
$ echo Näytẗkuva.png
Näyttökuva.png
Обратите внимание, что когда я нажимаю return, bash на самом деле содержит все имя файла; это просто дисплей терминала, который был сбит с толку.
TL; DR bash имеет некоторые ошибки обработки разборных акцентированных символов.
РЕДАКТИРОВАТЬ: после некоторого размышления, я думаю, что единственное полное решение - это исправить bash (/ ждать, пока его разработчики исправят это). Также может быть способ ввода символов в разложенном виде, но я понятия не имею, что это будет. Но я нашел некоторые частичные обходные пути:
Перетащите файл из Finder и вставьте его в правильном виде. Поскольку Finder получает имя файла из файловой системы, он уже разложен, поэтому он просто работает.
Вы можете фактически завершить табуляцию самого акцентированного символа. Например, если вы введете «Na», а затем нажмите «tab», он будет соответствовать «Näyttökuva.png», потому что каноническое разложение «ä» начинается с «a». Но если у вас есть файл с именем "Narwal.gif" в том же каталоге, это не очень поможет ...
Я не проверял это, но если вы привязываете вкладку к завершенному меню, а не к полному, она должна позволить вам переключаться между возможными совпадениями, чтобы вы могли выбрать желаемое, даже если вы не можете набрать следующую букву. (Или вы можете связать его с другим нажатием клавиши, поэтому вы можете использовать его только тогда, когда вам нужно.)
Для устранения проблемы с синхронизацией дисплея терминала вы можете привязать что-либо к redraw-current-line - это не предотвратит возникновение проблемы, но даст вам возможность повторно синхронизировать дисплей.
$ echo -e "N\xC3\xA4*" | ls
(эхо даетNä*
) результатыNäyttökuva.png
. Проблема существует и с другими оболочками в Mac OS; и, например, zshls N
автоматически заполняется доls Na<0308>ytto<0308>kuva.png
ls Nä*
в bash в Xubuntu, и оно работало должным образом, поэтому оно дает ошибку где-то между клавиатурой, OS X и терминалом. Я также проверил это в разделе Bootcamp, но проблема сохраняется (то есть, это происходит не только с файлами HFS +).Na
работает, ноNay
не работает (хотя это понятно, потому что на самом деле есть¨
междуa
иy
. В Xubuntuls Na*
не работает (хотяNä*
работает, так что на самом деле это не проблема). Что касается подстановочных знаков - еще один обходной путь может быть заменаä
иö
сa?
и ,o?
например ,ls Na?y*
это , конечно , увеличивает неопределенность, но может быть полезен в некоторых случаях..ls N* | xxd
в Xubuntu, дает ли он составные или разложенные символы?touch $'Na\xcc\x88ytto\xcc\x88kuva.png'
и посмотреть, что произойдет, - я предполагаю, что он создаст новый файл с очень очень похожим именем.Это старый вопрос, и нет однозначного ответа. Просто обходные пути.
Однако я объединил некоторую информацию из этого старого руководства, и как предложено и проинструктировано здесь :
Я установил новую версию Bash в своем Snow Leopard. После его установки, завершение bash работает правильно! (Snow Leopard поставляется с 3.2.48 (1) и MacPorts с 4.2.45_1). Не забудьте вносить изменения
/etc/shells
и работатьchsh
.Кроме того, из-за некоторых других инструкций, я имею в
.inputrc
:Не уверен, если они необходимы или не для правильной работы.
источник
Nä
(гдеä
предварительно составлено),Näyttökuva.png
а bash 3.2 - нет.iconv
это решение, которое работало для меня:см. /programming//a/23226449/1909531
источник