Bagaimana cara memasukkan karakter khusus sehingga Bash / Terminal memahaminya?

18

Katakanlah folder memiliki file bernama Näyttökuva.png(bagi mereka yang tertarik, itu adalah "tangkapan layar" dalam bahasa Finlandia). Inilah yang terjadi:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Ini juga memengaruhi penyelesaian-tab. Jika saya mulai mengetik ls Ndan menekan tabitu diperluas dengan benar ls Näyttökuva.png. Tetapi jika saya mulai mengetik, ls Nätab tidak berarti apa-apa.

Bagaimana saya bisa:

  • konfigurasikan bash / terminal sehingga mengerti karakter khusus
  • ketik karakter khusus sehingga bash / terminal memahaminya?

Dalam pengkodean Terminal diatur ke UTF-8 di tab Pengaturan – dan tab Pengkodean dalam keadaan standarnya, yaitu. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + beberapa kode Asia diaktifkan.


Bahkan orang asing (walaupun mungkin tidak penting untuk pertanyaan):

Jika saya mengetik ls N, tekan tab, hapus karakter dari ujung hingga terbaca ls Nädan tekan tablagi, perintah ini akan diperluas ke ls Nättökuva.png[sic].

Jika saya mencoba menghapus kembali surat-surat kedua ls Nädan tekan tab itu untuk memperluas ls Nätökuva.png. Jalankan ketiga diperluas ke ls Näökuva.png.

Untuk beberapa alasan, jalankan ke-4 memberi ls Nä̈kuva.png(perhatikan umlaut atas umlaut). Tab ls Nä̈memberi memberi ls Nä̈kuva.pngsetiap waktu. Namun demikian, ia bekerja:

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

$ history 2
518  ls Näyttökuva.png 
519  history 2
Jari Keinänen
sumber

Jawaban:

23

Saya pikir bash tersandung beberapa anomali dalam bagaimana aksen karakter ditangani. Anda mungkin ingin mengambil popcorn, karena ini akan mendapatkan sedikit teknis ...

Unicode memungkinkan beberapa karakter beraksen untuk diwakili dalam beberapa cara berbeda: sebagai "titik kode" yang mewakili karakter beraksen, atau sebagai serangkaian titik kode yang mewakili versi karakter yang tidak beraksen, diikuti oleh aksen. Misalnya, "ä" dapat direpresentasikan sebagai yang dikomposisikan sebagai U + 00E4 (UTF-8 0xc3a4, huruf kecil Latin 1 dengan diaeresis) atau didekomposisi sebagai U + 0061 U + 0308 (UTF-8 0x61cc88, huruf kecil latin a + menggabungkan diaeresis ).

Sistem file HFS + OS X mengharuskan semua nama file disimpan dalam representasi UTF-8 dalam bentuk yang sepenuhnya terurai . Dalam nama file HFS +, "ä" HARUS dikodekan sebagai 0x61cc88, dan "ö" HARUS dikodekan sebagai 0x6fcc88.

Saya cukup yakin apa yang terjadi di sini adalah bahwa ketika Anda mengetik "Näyttökuva.png" di baris perintah, itu "mengetik" karakter dalam bentuk yang sudah ditentukan sebelumnya. Ketika file dibuat, sistem file menguraikan karakter untuk penyimpanan. Semuanya baik-baik saja sejauh ini. Tetapi ketika Anda mencoba menggunakan penyelesaian-tab yang dimulai dengan "Nä", saya pikir bash gagal menguraikan "ä" sebelum mencari yang cocok, dan tentu saja tidak menemukan apa pun.

Untuk mengilustrasikan perbedaannya, inilah contoh pengkodean apa yang digunakan ketika saya cukup mengetik "Näyttökuva.png" di baris perintah, vs. apa yang digunakan ketika saya menyimpannya sebagai nama file dan menggunakan tab completion untuk mengisinya:

$ 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

Sekarang, tentang masalah karakter yang hilang saat menghapus dan melengkapi ulang tab, saya menduga itu terkait erat. Secara khusus, saya pikir bash "menghapus" satu titik kode per tekan tombol hapus, tetapi menghapus satu karakter dari jendela Terminal per tekan. Karena salah satu karakter yang dihapus ("ö" kali ini) terdiri dari dua titik kode, tetapi hanya satu karakter, tampilan Terminal menjadi tidak sinkron. Coba tab-melengkapi seluruh nama file, hapus kembali ke "Näytt", kemudian tab-pelengkap kembali: bash tampaknya berpikir bahwa hanya diaeresis yang menggabungkan yang dihapus, bukan keseluruhan "ö", sehingga ia menambahkan kembali diaeresis yang menggabungkan , tapi kali ini menempel pada "t":

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

Perhatikan bahwa ketika saya menekan kembali, bash sebenarnya memiliki seluruh nama file di sana; hanya tampilan Terminal yang bingung.

TL; DR bash memiliki beberapa bug yang menangani karakter beraksen terurai.

EDIT: setelah beberapa merenungkan, saya pikir satu-satunya solusi lengkap adalah untuk memperbaiki bash (/ tunggu pengembangnya untuk memperbaikinya). Mungkin juga ada cara untuk memasukkan karakter dalam bentuk terurai, tetapi saya tidak tahu apa yang akan terjadi. Tapi saya memang menemukan beberapa solusi parsial:

  1. Seret dan letakkan file dari pasta Finder dalam bentuk yang benar. Karena Finder mendapatkan nama file dari sistem file, itu sudah terurai, jadi itu hanya berfungsi.

  2. Anda benar-benar dapat melengkapi karakter beraksen itu sendiri. Misalnya, jika Anda mengetik "Na" dan kemudian tab, itu akan cocok dengan "Näyttökuva.png" karena dekomposisi kanonik "ä" dimulai dengan "a". Tetapi jika Anda memiliki file bernama "Narwal.gif" di direktori yang sama, itu tidak akan sangat membantu ...

  3. Saya belum menguji ini, tetapi jika Anda mengikat tab ke menu-selesai alih - alih lengkap, itu akan memungkinkan Anda tab melalui kemungkinan yang cocok sehingga Anda dapat memilih yang Anda inginkan bahkan jika Anda tidak dapat mengetik huruf berikutnya. (Atau Anda dapat mengikatnya dengan penekanan tombol yang berbeda, sehingga Anda dapat menggunakannya hanya saat diperlukan.)

  4. Untuk memperbaiki masalah dengan tampilan Terminal yang tidak sinkron, Anda dapat mengikat sesuatu untuk menggambar ulang-saat ini - itu tidak akan mencegah masalah terjadi, tetapi itu akan memberi Anda cara untuk menyinkronkan ulang tampilan.

Gordon Davisson
sumber
Terima kasih, saya menikmati popcorn. Saya pikir Anda telah menemukan penyebab masalahnya: menggunakan $ echo -e "N\xC3\xA4*" | ls(gema memberi Nä*) hasil Näyttökuva.png. Masalahnya ada juga dengan cangkang lain di Mac OS; dan dengan mis. zsh ls Notomatis dilengkapi kels Na<0308>ytto<0308>kuva.png
Jari Keinänen
Saya juga mencoba pelengkapan otomatis dan ls Nä*dalam bash di Xubuntu dan itu berfungsi dengan baik, sehingga bug di suatu tempat antara keyboard & OS X & Terminal. Saya juga menguji itu di dalam partisi Bootcamp, tetapi masalahnya tetap ada (mis. Itu tidak terjadi hanya dengan file HFS +).
Jari Keinänen
(Sekarang lihat hasil edit Anda tentang penyelesaian masalah) Setidaknya dua karya pertama. The # 2 menarik: autocompleting Nabekerja, tapi Naytidak (meskipun itu dapat dimengerti karena ada sebenarnya adalah ¨antara adan y. Dalam Xubuntu ls Na*tidak bekerja (meskipun Nä*. Karya sehingga benar-benar tidak masalah) Mengenai wildcard - salah satu solusi lainnya bisa mengganti ä& ödengan a?dan o?misalnya ls Na?y*. Tentu saja ini meningkatkan ambiguitas, tetapi mungkin berguna dalam beberapa kasus
Jari Keinänen
2
Alasan kerjanya di Xubuntu mungkin karena filesystem menggunakan bentuk yang sama dengan antarmuka terminal. Jika Anda melakukannya ls N* | xxddi Xubuntu, apakah itu memberikan karakter yang tersusun atau terurai?
Gordon Davisson
Dengan anggapan bahwa Xubuntu menyimpan nama file dalam bentuk yang tersusun, cobalah menjalankan perintah touch $'Na\xcc\x88ytto\xcc\x88kuva.png'dan lihat apa yang terjadi - tebakan saya adalah ia akan membuat file baru dengan nama yang sangat mirip.
Gordon Davisson
4

Ini adalah pertanyaan lama, dan tidak ada jawaban yang pasti. Hanya pemecahan masalah.

Namun saya menggabungkan beberapa informasi dari panduan lama ini, dan seperti yang disarankan dan diinstruksikan di sini :

Saya memasang bash yang lebih baru di Snow Leopard saya. Setelah menginstalnya, penyelesaian bash berfungsi dengan benar! (Snow Leopard dikirimkan bersama 3.2.48 (1) dan MacPorts diinstal 4.2.45_1). Ingatlah untuk membuat perubahan di /etc/shellsdan berjalan chsh.

Juga, karena beberapa instruksi lain, saya ada di .inputrc:

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

Tidak yakin apakah diperlukan atau tidak untuk pengoperasian yang benar.

Penguin liar
sumber
Anda benar: bash 4.2 selesai (di mana ädikomposisi sebelumnya) Näyttökuva.pngtetapi bash 3.2 tidak.
Lri