Tôi nghĩ rằng bash đang vấp phải một số bất thường trong cách xử lý các ký tự có dấu. Bạn có thể muốn lấy một ít bỏng ngô, bởi vì điều này sẽ mang lại kỹ thuật cho một chút ...
Unicode cho phép một số ký tự có dấu được thể hiện theo nhiều cách khác nhau: như một "điểm mã" đại diện cho ký tự có dấu hoặc như một chuỗi các điểm mã đại diện cho phiên bản không có dấu của ký tự, theo sau là dấu (s). Ví dụ: "ä" có thể được biểu thị trước là U + 00E4 (UTF-8 0xc3a4, chữ cái nhỏ Latinh 1 có dấu) ).
Hệ thống tập tin HFS + của OS X yêu cầu tất cả tên tệp được lưu trữ trong biểu diễn UTF-8 ở dạng phân tách hoàn toàn của chúng . Trong tên tệp HFS +, "ä" PHẢI được mã hóa thành 0x61cc88 và "ö" PHẢI được mã hóa thành 0x6fcc88.
Tôi khá chắc chắn những gì đang xảy ra ở đây là khi bạn gõ "Näyttökuva.png" vào dòng lệnh, nó sẽ "gõ" các ký tự ở dạng được sắp xếp sẵn. Khi tệp được tạo, hệ thống tệp sẽ phân tách các ký tự để lưu trữ. Mọi thứ đều ổn cho đến nay. Nhưng khi bạn cố gắng sử dụng hoàn thành tab bắt đầu bằng "Nä", tôi nghĩ bash không thể phân tách "ä" trước khi tìm kiếm kết quả khớp và dĩ nhiên nó không tìm thấy.
Để minh họa sự khác biệt, đây là một ví dụ về cách mã hóa được sử dụng khi tôi chỉ gõ "Näyttökuva.png" vào dòng lệnh, so với những gì được sử dụng khi tôi lưu trữ dưới dạng tên tệp và sử dụng hoàn tất tab để điền vào:
$ 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
Bây giờ, đối với vấn đề các nhân vật bị mất khi xóa và hoàn thành lại tab, tôi nghi ngờ điều đó có liên quan chặt chẽ. Cụ thể, tôi nghĩ bash đang "xóa" một điểm mã trên mỗi lần nhấn phím xóa, nhưng xóa một ký tự khỏi cửa sổ Terminal mỗi lần nhấn. Vì một trong các ký tự bị xóa ("ö" lần này) bao gồm hai điểm mã, nhưng chỉ có một ký tự, màn hình Terminal không đồng bộ. Hãy thử hoàn thành tab toàn bộ tên tệp, xóa nó trở lại thành "Näytt", sau đó hoàn thành lại tab: bash dường như nghĩ rằng chỉ có diaeresis kết hợp đã bị xóa, chứ không phải toàn bộ "ö", do đó, nó lại thêm vào diaeresis kết hợp , nhưng lần này nó gắn vào "t":
$ echo Näytẗkuva.png
Näyttökuva.png
Lưu ý rằng khi tôi nhấn return, bash thực sự có toàn bộ tên tệp ở đó; nó chỉ là màn hình Terminal bị nhầm lẫn.
TL; DR bash có một số lỗi xử lý các ký tự có dấu có thể phân tách.
EDIT: sau khi nghiền ngẫm, tôi nghĩ giải pháp đầy đủ duy nhất là sửa lỗi bash (/ chờ các nhà phát triển của nó sửa nó). Cũng có thể có một cách để nhập các ký tự ở dạng phân tách, nhưng tôi không biết đó là gì. Nhưng tôi đã tìm thấy một số cách giải quyết một phần:
Kéo và thả tệp từ Finder sẽ dán ở dạng chính xác. Vì Finder tìm được tên tệp từ hệ thống tập tin, nên nó đã bị phân tách, vì vậy nó chỉ hoạt động.
Bạn thực sự có thể hoàn thành tab nhân vật có dấu. Ví dụ: nếu bạn nhập "Na" và sau đó tab, nó sẽ khớp với "Näyttökuva.png" vì phân tách chính tắc của "ä" bắt đầu bằng "a". Nhưng nếu bạn có một tệp có tên "Narwal.gif" trong cùng thư mục, điều đó sẽ không hữu ích ...
Tôi chưa kiểm tra điều này, nhưng nếu bạn liên kết tab với hoàn thành menu thay vì hoàn thành, nó sẽ cho phép bạn tab thông qua các kết quả khớp có thể để bạn có thể chọn cái bạn muốn ngay cả khi bạn không thể gõ chữ cái tiếp theo. (Hoặc bạn có thể liên kết nó với một tổ hợp phím khác, vì vậy bạn chỉ có thể sử dụng nó khi bạn cần.)
Để khắc phục sự cố với màn hình Terminal bị mất đồng bộ hóa, bạn có thể liên kết một cái gì đó để vẽ lại dòng hiện tại - nó sẽ không ngăn sự cố xảy ra, nhưng nó sẽ cho bạn cách đồng bộ hóa màn hình.
$ echo -e "N\xC3\xA4*" | ls
(tiếng vang choNä*
)Näyttökuva.png
. Vấn đề tồn tại cũng với các shell khác trong Mac OS; và với ví dụ zshls N
được tự động hoàn thànhls Na<0308>ytto<0308>kuva.png