Bash / Terminal'in anlaması için özel karakterler nasıl girilir?


18

Diyelim ki bir klasörde bir dosya var Näyttökuva.png(ilgilenenler için Fince “ekran görüntüsü”). Olan şey budur:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Bu sekme otomatik tamamlamayı da etkiler. Yazmaya başlar ls Nve basarsam tabdoğru şekilde genişletilir ls Näyttökuva.png. Ama ls Näsekme yazmaya başlarsam hiçbir şey yapmaz.

Nasıl yapabilirim:

  • bash / terminal'i özel karakterleri anlayacak şekilde yapılandır
  • bash / terminal onları anlamak için özel karakterler?

Terminal'in kodlaması Ayarlar sekmesinde UTF-8 olarak ayarlanmıştır ve Kodlama – sekmesi varsayılan durumundadır; UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + bazı Asya kodlamaları etkinleştirilmiştir.


Hatta yabancı (muhtemelen soru için gerekli olmasa da):

Ben yazarsam ls N, tuşuna basın tab, okunana kadar karakterleri sondan silin ls Näve tabtekrar basın , komut ls Nättökuva.png[sic] olarak genişler .

Harfleri ikinci kez geri silmeye çalışır ls Näve sekmeye basarsanız genişler ls Nätökuva.png. Üçüncü çalıştırma, olarak genişler ls Näökuva.png.

Herhangi bir nedenle, 4. tur verir ls Nä̈kuva.png(umlaut üzerindeki umlautlara dikkat edin). Her seferinde sekmeleri ls Nä̈verir ls Nä̈kuva.png. Bununla birlikte, çalışır:

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

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

Yanıtlar:


23

Bence bash, aksanlı karakterlerin nasıl ele alındığına dair bazı anormalliklerin üzerinden geçiyor. Biraz patlamış mısır almak isteyebilirsiniz, çünkü bu biraz teknik olacak ...

Unicode, bazı aksanlı karakterlerin birkaç farklı şekilde temsil edilmesine izin verir: aksanlı karakteri temsil eden bir "kod noktası" olarak veya karakterin aksanlı olmayan sürümünü temsil eden bir dizi kod noktası, ardından aksan (lar). Örneğin, "ä", önceden U + 00E4 (UTF-8 0xc3a4, Latin alfabesinde küçük harf 1 ile diyaerez) veya U + 0061 U + 0308 (UTF-8 0x61cc88, Latin alfabesinde küçük harf + ).

OS X'in HFS + dosya sistemi, tüm dosya adlarının tamamen ayrıştırılmış formlarının UTF-8 temsilinde depolanmasını gerektirir . HFS + dosya adında "ä" 0x61cc88 olarak kodlanmalı ve "ö" 0x6fcc88 olarak kodlanmalı ZORUNLU.

Burada ne olduğuna eminim komut satırına "Näyttökuva.png" yazdığınızda, karakterleri önceden oluşturulmuş biçimde "yazıyor". Dosya oluşturulduğunda, dosya sistemi karakterlerin saklanması için ayrıştırılmasını sağlar. Şimdiye kadar her şey yolunda. Ancak "Nä" ile başlayan sekme tamamlamayı kullanmaya çalıştığınızda, bash'ın eşleşmeleri aramadan önce "ä" yi parçalayamadığını ve tabii ki hiçbirini bulamadığını düşünüyorum.

Farkı göstermek için, komut satırına sadece "Näyttökuva.png" yazdığımda hangi kodlamanın kullanıldığına ilişkin bir örnek, bir dosya adı olarak sakladığımda ve doldurmak için sekme tamamlamayı kullandığımda kullanılana karşılık:

$ 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

Şimdi, silme ve yeniden sekme tamamlama sırasında karakterlerin kaybolması konusuna gelince, bunun yakından ilişkili olduğundan şüpheleniyorum. Özellikle, bash'ın sil tuşuna her basışta bir kod noktasını "sildiğini", ancak her basışta Terminal penceresinden bir karakteri sildiğini düşünüyorum. Silinen karakterlerden biri (bu sefer "ö") iki kod noktasından oluştuğu, ancak yalnızca bir karakter içerdiği için, Terminal ekranı senkronize olmaz. Tüm dosya adını sekmeyi tamamlamayı, "Näytt" a geri silmeyi ve ardından yeniden sekme işlemini tamamlamayı deneyin: bash "ö" ifadesinin tamamını değil, yalnızca birleştirici diyabetin silindiğini düşünüyor. , ancak bu sefer "t" ye bağlanır:

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

Return tuşuna bastığımda, bash dosya adının aslında orada olduğunu; karıştırılan sadece Terminal ekranı.

TL; DR bash, ayrıştırılabilir aksanlı karakterleri işleyen bazı hatalara sahiptir.

EDIT: bazı mulling sonra, tek tam çözüm bash düzeltmek olduğunu düşünüyorum (/ geliştiricileri düzeltmek için bekleyin). Ayrıştırılmış biçimde karakterler girmenin bir yolu da olabilir, ancak bunun ne olacağı hakkında hiçbir fikrim yok. Ancak bazı kısmi çözümler buldum:

  1. Finder macunlarındaki bir dosyayı doğru biçimde sürükleyip bırakın. Finder dosya adını dosya sisteminden aldığından zaten ayrıştırılmıştır, bu yüzden çalışır.

  2. Aksanlı karakterin kendisini sekmeli olarak tamamlayabilirsiniz. Örneğin, "Na" ve sonra sekmesini yazarsanız, "Näyttökuva.png" ile eşleşir, çünkü "ä" kurallı ayrışması "a" ile başlar. Ancak aynı dizinde "Narwal.gif" adında bir dosyanız varsa, bu çok yardımcı olmaz ...

  3. Bunu test etmedim, ancak sekmeyi tam yerine menü tamamına bağlarsanız , bir sonraki harfi yazamasanız bile istediğinizi seçebilmeniz için olası eşleşmeler arasında geçiş yapmanıza izin vermelidir. (Ya da farklı bir tuşa bağlayabilirsiniz, böylece sadece ihtiyacınız olduğunda kullanabilirsiniz.)

  4. Terminal ekranının senkronizasyondan çıkmasıyla ilgili sorunu gidermek için, yeniden çizilen akım hattına bir şey bağlayabilirsiniz - sorunun oluşmasını engellemez, ancak ekranı yeniden senkronize etmenin bir yolunu verir.


Teşekkürler, patlamış mısırdan keyif aldım. Bence sorunun nedenini çiviledin: sonuçları $ echo -e "N\xC3\xA4*" | ls(yankı verir Nä*) Näyttökuva.png. Sorun, Mac OS'deki diğer kabuklarda da var; ve örneğin zsh ls Nile otomatik olarak tamamlanırls Na<0308>ytto<0308>kuva.png
Jari Keinänen

Ben de ls Nä*Xubuntu otomatik tamamlama ve bash denedim ve düzgün çalıştı, bu yüzden klavye & OS X & Terminal arasında bir yere hata. Bunu Bootcamp bölümünde de test ettim, ancak sorun devam ediyor (yani sadece HFS + dosyalarıyla gerçekleşmiyor).
Jari Keinänen

(Şimdi geçici çözümlerle ilgili düzenlemenizi gördünüz) En azından ilk iki çalışma. # 2 ilginç: otomatik tamamlama Naçalışıyor, ancak Nayçalışmıyor (anlaşılabilir olsa da, aslında ve ¨arasında olduğu için . Xubuntu'da çalışmıyor ( bu yüzden gerçekten bir sorun değil). yerine & ile ve mesela . Tabii bu artışlar belirsizlik ki, ancak bazı durumlarda kullanışlı gelebilir.ayls Na*Nä*äöa?o?ls Na?y*
Jari Keinanen

2
Xubuntu'da çalışmasının nedeni, dosya sisteminin terminal arabirimiyle aynı formu kullanması olabilir. ls N* | xxdXubuntu'da yaparsanız , oluşturulmuş veya ayrıştırılmış karakterler veriyor mu?
Gordon Davisson

Xubuntu'nun dosya touch $'Na\xcc\x88ytto\xcc\x88kuva.png'adını oluşturulmuş formda sakladığı varsayılarak, komutu çalıştırmayı deneyin ve ne olduğunu görün - tahminimce çok benzer bir ada sahip yeni bir dosya oluşturacaksınız.
Gordon Davisson

4

Bu eski bir soru ve kesin bir cevap yok. Sadece geçici çözümler.

Ancak, bu eski rehberdeki bazı bilgileri birleştirdim ve burada önerildiği ve talimat verildiği gibi :

Snow Leopard'ımda daha yeni bir karga kurdum. Kurduktan sonra, bash tamamlama doğru çalışıyor! (Snow Leopard, 3.2.48 (1) ile birlikte sevk edildi ve MacPorts 4.2.45_1 yüklendi). Değişen /etc/shellsve çalışan değişiklikleri yapmayı unutmayın chsh.

Ayrıca, diğer bazı talimatlar nedeniyle, ben var .inputrc:

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

Düzgün çalışma için gerekli olup olmadıklarından emin değilim.


Haklısın: bash 4.2 tamamlandı ( äönceden oluşturulmuş) Näyttökuva.pngama bash 3.2 yapmıyor.
Lri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.