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äytẗkuva.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:
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.
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 ...
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.)
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.
$ echo -e "N\xC3\xA4*" | ls
(gema memberiNä*
) hasilNäyttökuva.png
. Masalahnya ada juga dengan cangkang lain di Mac OS; dan dengan mis. zshls N
otomatis dilengkapi kels Na<0308>ytto<0308>kuva.png
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 +).Na
bekerja, tapiNay
tidak (meskipun itu dapat dimengerti karena ada sebenarnya adalah¨
antaraa
dany
. Dalam Xubuntuls Na*
tidak bekerja (meskipunNä*
. Karya sehingga benar-benar tidak masalah) Mengenai wildcard - salah satu solusi lainnya bisa menggantiä
&ö
dengana?
dano?
misalnyals Na?y*
. Tentu saja ini meningkatkan ambiguitas, tetapi mungkin berguna dalam beberapa kasusls N* | xxd
di Xubuntu, apakah itu memberikan karakter yang tersusun atau terurai?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.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/shells
dan berjalanchsh
.Juga, karena beberapa instruksi lain, saya ada di
.inputrc
:Tidak yakin apakah diperlukan atau tidak untuk pengoperasian yang benar.
sumber
Nä
(di manaä
dikomposisi sebelumnya)Näyttökuva.png
tetapi bash 3.2 tidak.iconv
adalah solusinya, yang bekerja untuk saya:lihat /programming//a/23226449/1909531
sumber