Як ввести спеціальних символів, щоб Bash / Terminal розумів їх?


18

Скажімо, у папці є файл з назвою Näyttökuva.png(для тих, хто цікавиться, це "скріншот" по-фінськи). Ось що відбувається:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

$ ls Nä*
ls: Nä*: No such file or directory

Це також впливає на автоматичне завершення вкладки. Якщо я почніть вводити ls Nі натискати, tabйого правильно розгорнути на ls Näyttökuva.png. Але якщо я почну вводити ls Näвкладки, нічого не призведе.

Як я можу:

  • налаштуйте bash / terminal, щоб він розумів спеціальні символи
  • введіть спеціальні символи, щоб bash / terminal їх розумів?

У кодуванні терміналу встановлено значення UTF-8 на вкладці Налаштування –, а вкладка Кодування – знаходиться у замовчуванні, тобто. Увімкнено UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + деякі азіатські кодування.


Навіть незнайомий (хоча, мабуть, не важливий для питання):

Якщо я набираю ls N, натискаю tab, видаляю символи з кінця, поки він не читається, ls Näі натискаю tabзнову, команда розгортається до ls Nättökuva.png[sic].

Якщо я спробую видалити літери вдруге назад, ls Näі натисніть вкладку, на яку вона розширюється ls Nätökuva.png. Третій запуск розширюється до ls Näökuva.png.

Чомусь 4-й пробіг дає ls Nä̈kuva.png(зауважте умлатів над умлаутами). Вкладка ls Nä̈дарує ls Nä̈kuva.pngкожен раз. Тим не менш, це працює:

$ ls Nä̈kuva.png
Näyttökuva.png

$ history 2
518  ls Näyttökuva.png 
519  history 2

Відповіді:


23

Я думаю, що Баш стикається з деякими аномаліями в обробці наголошених персонажів. Ви можете захопити трохи попкорну, тому що це стане трохи технічним ...

Unicode дозволяє представити деякі наголошені символи декількома різними способами: як "кодову точку", що представляє наголошений символ, або як серію кодових точок, що представляють неакцентовану версію символу, з подальшим наголосом. Наприклад, "ä" може бути представлений як попередньо складений як U + 00E4 (UTF-8 0xc3a4, мала латинська літера 1 з діарезом), так і розкладений як U + 0061 U + 0308 (UTF-8 0x61cc88, мала латинська буква a + поєднує діарез ).

Файлова система HFS + OS X вимагає, щоб усі імена файлів зберігалися у представленні 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, здається, вважає, що видалений лише поєднувальний діарез, а не весь "ö", тому він знову додає поєднувальний діарез , але цього разу воно приєднується до "t":

$ echo Näytkuva.png 
Näyttökuva.png

Зауважте, що коли я натискаю return, bash фактично має все ім'я файлу; це просто сплутаний дисплей терміналу.

TL; DR bash має деякі помилки, які обробляють символи з наголосом, що розкладаються.

EDIT: після деякого розміщення я думаю, що єдине повноцінне рішення - це виправити bash (/ чекати, коли його розробники виправлять). Також може бути спосіб введення символів у розкладеному вигляді, але я не маю уявлення, що це було б. Але я знайшов деякі часткові обходи:

  1. Перетягування файлу із вставок Finder у правильному вигляді. Оскільки Finder отримує ім'я файлу з файлової системи, воно вже розкладається, тому воно просто працює.

  2. Ви можете фактично заповнити сам наголошений символ. Наприклад, якщо ви введете "Na", а потім вкладку, вона відповідатиме "Näyttökuva.png", оскільки канонічне розкладання "ä" починається з "a". Але якщо у тому самому каталозі є файл з назвою "Narwal.gif", це не буде дуже корисно ...

  3. Я цього не перевіряв, але якщо ви прив’язуєте вкладку до меню-заповнення замість повної, вона повинна переглядати можливі відповідність, щоб ви могли вибрати потрібне, навіть якщо не зможете ввести наступний лист. (Або ви можете прив'язати його до іншого натискання клавіші, тому можете використовувати його лише тоді, коли вам потрібно.)

  4. Щоб вирішити проблему, коли дисплей термінала не синхронізувався, ви можете прив’язати щось до перемальовування поточної лінії - це не запобіжить виникненню проблеми, але це дасть вам спосіб пересинхронізувати дисплей.


Спасибі, мені сподобалось попкорн. Я думаю, що ти прибив причину проблеми: використовуючи $ echo -e "N\xC3\xA4*" | ls(відлуння дає Nä*) результати Näyttökuva.png. Проблема існує і з іншими оболонками в Mac OS; і, наприклад, zsh ls Nавтоматично завершується доls Na<0308>ytto<0308>kuva.png
Jari Keinänen

Я також спробував автозавершення та ls Nä*в bash у Xubuntu, і він працював належним чином, тому він помиляється десь між клавіатурою та ОС X & Terminal. Я також перевірив це в розділі Bootcamp, але проблема зберігається (тобто це відбувається не лише з файлами HFS +).
Ярі Кейненен

(Зараз побачила вашу редакцію щодо обхідних шляхів) Принаймні перші дві роботи. # 2 цікаво: автозавершення Naпрацює, але Nayне робить (хоча це зрозуміло, оскільки насправді є ¨між aі y. У Xubuntu ls Na*не працює (хоча Nä*працює, так що це насправді не проблема). Що стосується макетів - один інший спосіб вирішення може бути заміна äі öз a?і , o?наприклад , ls Na?y*це , звичайно , збільшує невизначеність, але може бути корисний в деяких випадках ..
Ярі Кейнянен

2
Причина роботи в Xubuntu може бути просто в тому, що файлова система використовує ту ж форму, що і термінальний інтерфейс. Якщо ви робите ls N* | xxdв Xubuntu, чи дає вона складені чи розкладені символи?
Гордон Девіссон

Якщо припустити, що Xubuntu зберігає ім'я файлу у складеному вигляді, спробуйте запустити команду touch $'Na\xcc\x88ytto\xcc\x88kuva.png'і подивіться, що відбувається - я здогадуюсь, що це створить новий файл з дуже дуже схожим ім'ям.
Гордон Девіссон

4

Це старе запитання, а жодної однозначної відповіді. Просто обхідні шляхи.

Однак я об'єднав деяку інформацію з цього старого керівництва, і як це було запропоновано і проінструктовані тут :

Я встановив новіший баш в своєму сніговому леопарді. Після його встановлення, завершення роботи bash працює правильно! (Snow Leopard поставляється з 3.2.48 (1), а MacPorts встановлено 4.2.45_1). Не забудьте внести зміни /etc/shellsта працювати chsh.

Крім деяких інших інструкцій, я маю .inputrc:

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

Не впевнені, потрібні вони чи ні для правильної роботи.


Ви маєте рацію: bash 4.2 завершується (де äпопередньо складено), Näyttökuva.pngале bash 3.2 не робить.
Лрі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.