Làm thế nào để nhập các ký tự đặc biệt để Bash / Terminal hiểu chúng?


18

Giả sử một thư mục có một tệp được gọi Näyttökuva.png(đối với những người quan tâm, đó là ảnh chụp màn hình hình ảnh cá tính ở Phần Lan). Đây là những gì sẽ xảy ra:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Điều này cũng ảnh hưởng đến việc tự động hoàn thành tab. Nếu tôi bắt đầu gõ ls Nvà nhấn tabnó sẽ được mở rộng chính xác ls Näyttökuva.png. Nhưng nếu tôi bắt đầu gõ ls Nätab không làm gì cả.

Làm thế nào tôi có thể:

  • cấu hình bash / terminal để nó hiểu các ký tự đặc biệt
  • Gõ các ký tự đặc biệt để bash / terminal hiểu chúng?

Mã hóa trong Terminal được đặt thành UTF-8 trong tab Cài đặt cài đặt và tab Mã hóa ở trạng thái mặc định, nghĩa là. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + một số mã hóa châu Á được bật.


Ngay cả người lạ (mặc dù có lẽ không cần thiết cho câu hỏi):

Nếu tôi gõ ls N, nhấn tab, xóa các ký tự từ cuối cho đến khi nó đọc ls Nävà nhấn tablại, lệnh sẽ mở rộng thành ls Nättökuva.png[sic].

Nếu tôi cố xóa các chữ cái lần thứ hai trở lại ls Nävà nhấn tab, nó sẽ mở rộng ra ls Nätökuva.png. Lần chạy thứ ba mở rộng tới ls Näökuva.png.

Vì một số lý do, lần chạy thứ 4 đưa ra ls Nä̈kuva.png(chú ý các ô trên các ô). Tabing ls Nä̈cho ls Nä̈kuva.pngmỗi lần. Tuy nhiên, nó hoạt động:

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

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

Câu trả lời:


23

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äytkuva.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:

  1. 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.

  2. 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 ...

  3. 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.)

  4. Để 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.


Cảm ơn, tôi rất thích bỏng ngô. Tôi nghĩ rằng bạn đã đóng đinh nguyên nhân của vấn đề: sử dụng kết quả $ echo -e "N\xC3\xA4*" | ls(tiếng vang cho Nä*) 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ụ zsh ls Nđược tự động hoàn thànhls Na<0308>ytto<0308>kuva.png
Jari Keinänen

Tôi cũng đã thử tự động hoàn thành và ls Nä*bash trong Xubfox và nó hoạt động bình thường, do đó, nó bị lỗi ở đâu đó giữa bàn phím & OS X & Terminal. Tôi cũng đã kiểm tra rằng trong phân vùng Bootcamp, nhưng sự cố vẫn còn (nghĩa là nó không xảy ra chỉ với các tệp HFS +).
Jari Keinänen

(Bây giờ đã thấy chỉnh sửa của bạn liên quan đến cách giải quyết) Ít nhất là hai công việc đầu tiên. Số 2 rất thú vị: tự động hoàn thành Nacông việc, nhưng Naykhông (mặc dù điều đó có thể hiểu được vì thực sự có ¨giữa ay. Trong Xubfox ls Na*không hoạt động (mặc dù Nä*nó hoạt động nên nó thực sự không phải là vấn đề). thay thế äöbằng a?o?ví dụ ls Na?y*. Tất nhiên điều này làm tăng sự mơ hồ, nhưng nó có thể có ích trong một số trường hợp.
Jari Keinänen

2
Lý do nó hoạt động trong Xubfox có thể là do hệ thống tập tin sử dụng hình thức giống như giao diện đầu cuối. Nếu bạn làm ls N* | xxdtrong Xubfox, nó có cung cấp các ký tự sáng tác hoặc phân tách không?
Gordon Davisson

Giả sử rằng Xubfox lưu trữ tên tệp ở dạng tổng hợp, hãy thử chạy lệnh touch $'Na\xcc\x88ytto\xcc\x88kuva.png'và xem điều gì xảy ra - tôi đoán là nó sẽ tạo một tệp mới với tên rất giống nhau.
Gordon Davisson

4

Đây là một câu hỏi cũ, và không có câu trả lời chắc chắn. Chỉ là cách giải quyết.

Tuy nhiên, tôi đã kết hợp một số thông tin từ hướng dẫn cũ này, và như được đề xuất và hướng dẫn ở đây :

Tôi đã cài đặt một bash mới hơn trong Snow Leopard của tôi. Sau khi cài đặt nó, bash hoàn thành hoạt động chính xác! (Snow Leopard được vận chuyển với 3.2.48 (1) và MacPorts được cài đặt 4.2.45_1). Hãy nhớ thực hiện các thay đổi trong /etc/shellsvà chạy chsh.

Ngoài ra, vì một số hướng dẫn khác, tôi có .inputrc:

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

Không chắc chắn nếu chúng được yêu cầu hoặc không hoạt động đúng.


Bạn đã đúng: bash 4.2 hoàn thành (nơi äđược sắp sẵn) Näyttökuva.pngnhưng bash 3.2 thì không.
Lri

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.