วิธีป้อนอักขระพิเศษเพื่อให้ 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ätabbing ไม่ทำอะไรเลย

ฉันจะทำได้อย่างไร:

  • กำหนดค่า 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.pngls Näökuva.png

ด้วยเหตุผลบางอย่างการเรียกใช้ครั้งที่ 4 จะls Nä̈kuva.pngแจ้งให้ทราบ (เครื่องหมาย umlauts เหนือเครื่องหมาย umlauts) การแท็บการ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 อนุญาตให้อักขระที่เน้นเสียงบางตัวสามารถแสดงได้หลายวิธี: เป็น "จุดรหัส" ที่แสดงถึงอักขระที่เน้นเสียงหรือเป็นชุดของจุดรหัสที่แสดงถึงตัวอักษรที่ไม่ได้รับการเน้นเสียงตามด้วยสำเนียง ตัวอย่างเช่น "ä" สามารถแสดงเป็น precomposed เป็น U + 00E4 (UTF-8 0xc3a4, อักษรตัวเล็กละติน 1 พร้อม diaeresis) หรือแยกย่อยเป็น U + 0061 U + 0308 (UTF-8 0x61cc88, ละตินอักษรตัวเล็ก + การรวม diaeresis )

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" จากนั้นทำการเติมแท็บใหม่: ทุบตีดูเหมือนว่าจะคิดว่ามีเพียงไดอะเรซิสที่รวมกันเท่านั้นที่ถูกลบไม่ใช่ทั้งหมด "ö" ดังนั้นจึงเพิ่มการรวมไดอะเรีย แต่คราวนี้มันติดกับ "t":

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

โปรดทราบว่าเมื่อฉันกด Return จริงทุบตีมีชื่อไฟล์ทั้งหมดที่นั่น; มันเป็นเพียงจอแสดงผลเทอร์มินัลที่สับสน

TL; DR bash มีข้อบกพร่องบางอย่างในการจัดการอักขระเน้นเสียงที่แยกทิ้ง

แก้ไข: หลังจาก mulling บางฉันคิดว่าทางออกเต็มเพียงอย่างเดียวคือการแก้ไขทุบตี (/ รอให้นักพัฒนาเพื่อแก้ไข) อาจมีวิธีป้อนอักขระในรูปแบบย่อยสลาย แต่ฉันไม่รู้ว่าจะเป็นอย่างไร แต่ฉันพบวิธีแก้ไขบางส่วน:

  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ä*ทุบตีใน Xubuntu และทำงานได้อย่างถูกต้องดังนั้นจึงมีข้อบกพร่องระหว่างแป้นพิมพ์ & OS X & Terminal ฉันยังทดสอบว่าภายในพาร์ทิชัน Bootcamp แต่ปัญหายังคงอยู่ (เช่นมันไม่ได้เกิดขึ้นเฉพาะกับไฟล์ HFS +)
Jari Keinänen

(ตอนนี้เห็นการแก้ไขของคุณเกี่ยวกับการแก้ไขปัญหา)อย่างน้อยสองงานแรก # 2 น่าสนใจ: การเติมข้อความอัตโนมัติNaทำงานได้ แต่Nayไม่ (แม้ว่ามันจะเข้าใจได้เพราะมีอยู่¨ระหว่างaและyใน Xubuntu ls Na*ใช้งานไม่Nä*ได้ การแทนที่ä& öด้วยa?และo?เช่นls Na?y*กันแน่นอนว่านี่จะเพิ่มความกำกวม แต่อาจมีประโยชน์ในบางกรณี
Jari Keinänen

2
เหตุผลที่ใช้งานใน Xubuntu อาจเป็นเพราะระบบไฟล์ใช้รูปแบบเดียวกับส่วนต่อประสาน ถ้าคุณทำls N* | xxdใน Xubuntu มันมีอักขระที่ประกอบด้วยหรือไม่หรือไม่?
Gordon Davisson

สมมติว่า Xubuntu เก็บชื่อไฟล์ในรูปแบบที่สงบลองเรียกใช้คำสั่งtouch $'Na\xcc\x88ytto\xcc\x88kuva.png'และดูว่าเกิดอะไรขึ้น - ฉันเดาว่ามันจะสร้างไฟล์ใหม่ที่มีชื่อคล้ายกันมาก
Gordon Davisson

4

นี่เป็นคำถามเก่าและไม่มีคำตอบที่ชัดเจน เพียงแก้ไขปัญหาชั่วคราว

อย่างไรก็ตามฉันรวมข้อมูลบางอย่างจากคู่มือเก่านี้และตามที่แนะนำและแนะนำที่นี่ :

ฉันติดตั้งทุบตีใหม่ใน Snow Leopard ของฉัน หลังจากติดตั้งเสร็จสิ้นการทุบตีทำงานอย่างถูกต้อง! (Snow Leopard มาพร้อมกับ 3.2.48 (1) และ MacPort ติดตั้ง 4.2.45_1) อย่าลืมที่จะทำให้การเปลี่ยนแปลงในการทำงาน/etc/shellschsh

นอกจากนี้เนื่องจากคำแนะนำอื่น ๆ ฉันมีใน.inputrc:

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

ไม่แน่ใจว่าจำเป็นหรือไม่สำหรับการดำเนินการที่เหมาะสม


คุณพูดถูก: ทุบตี 4.2 สำเร็จ(ซึ่งäถูกนำมาไว้ล่วงหน้า) และNäyttökuva.pngทุบตี 3.2 ไม่ได้
Lri

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.