Son zamanlarda kabukta çok zaman geçiriyorum ve sekme otomatik tamamlamanın nasıl çalıştığını merak ediyorum. Arkasındaki mekanizma nedir? Bash her dizinin içeriğini nasıl biliyor?
Son zamanlarda kabukta çok zaman geçiriyorum ve sekme otomatik tamamlamanın nasıl çalıştığını merak ediyorum. Arkasındaki mekanizma nedir? Bash her dizinin içeriğini nasıl biliyor?
Yanıtlar:
Otomatik tamamlamanın iki bölümü vardır:
Readline kitaplığı, daha önce fixje tarafından belirtildiği gibi, komut satırı düzenlemesini yönetir ve tamamlamayı etkinleştirmek için sekmeye basıldığında bash'a geri çağırır. Bash daha sonra olası tamamlamaların bir listesini verir (bir sonraki noktaya bakın) ve önceden yazılmış olan karakterlerle net bir şekilde tanımlandığı kadar çok sayıda karakter ekler. (Okuma satırı kitaplığını oldukça yapılandırabilirsiniz , Bash'in Komut satırı düzenleme bölümüne bakın. ayrıntılar için kullanım kılavuzu.)
Bash'in kendisi, completetek tek komutlar için bir tamamlama mekanizması tanımlamak için yerleşik olarak bulunur . Mevcut komut için hiçbir şey tanımlanmamışsa, tamamlamayı dosya adına göre kullanır (Ignacio'nun dediği gibi opendir / readdir kullanarak).
Kendi tamamlamalarınızı tanımlayan kısım Programlanabilir Tamamlama bölümünde açıklanmaktadır . Kısacası,
complete «options» «command»bazı komutların tamamlanmasını sizinle tanımlayın. Örneğin , komut için bir argümanı tamamlarken , mevcut sistemin kullanıcılarını aradığınıcomplete -u su söylüyor
.su
Bu, normal seçeneklerin kapsayabileceğinden daha karmaşıksa (örneğin, bağımsız değişken indeksine bağlı olarak farklı tamamlamalar veya önceki bağımsız değişkenlere bağlı olarak), -F functionolası tamamlamaların listesini oluşturmak için bir kabuk işlevini çağıran kullanabilirsiniz . (Bu, örneğin, alt komuta ve bazen verilen seçeneklere bağlı olarak çok karmaşık olan ve bazen dalların adlarını kullanan (bash'ın bilmediği hiçbir şey olmayan) git tamamlama için kullanılır.
completeNeyin mümkün olduğuna dair bir izlenim sahibi olmak için mevcut bash ortamınızda tanımlanan mevcut tamamlamaları basitçe kullanarak listeleyebilirsiniz . Eğer bash-tamamlama paketi yüklüyse (veya sisteminizde nasıl adlandırılırsa), birçok komut için tamamlamalar kurulur ve Wrikken'in dediği gibi, /etc/bash_completionbunu yapılandırmak için genellikle kabuk başlangıcında çalıştırılan bir bash betiği içerir. Ek özel tamamlama komut dosyaları yerleştirilebilir /etc/bash_completion.d; bunların hepsi kaynaklıdır /etc/bash_completion.
Temel bilgilerle ilgileniyorsanız: Bash, geçmişi ve temel tamamlamayı içeren readline'ı kullanır . Ayrıntılı bir anlayış elde etmek istiyorsanız kaynağı inceleyebilirsiniz. Dahası, kendi CLI arayüzlerinizi tamamlamak için readline'ı kullanabilirsiniz.
/etc/bash_completion(en azından, Debian'da sihrin çoğu buradadır).