Ubuntu tarafından kullanılan Bash Tamamlama kütüphanesinde bir hata buldunuz .
Ne anlama geliyor?
Ubuntu, bash tamamlanmasını akıllı hale getirmek için bash tamamlama kütüphanesini kullanır. Bu kütüphane yaşıyor /usr/share/bash-completion/bash_completion.
Temel olarak, bu kütüphane tipik komutlar ve bunların nasıl tamamlanacağını bilen birkaç akıllı işlev bildirir. Düğmesine her bastığınızda Tab, bu kitaplıktaki işlevler çağrılır ve geçerli komut satırınızı tamamlamaya çalışır. Örneğin, apt-get iTabyazdığınızda bunu tamamlayacaktır apt-get install. Bu kütüphaneyi kaynaklamazsanız, yalnızca standart, ilkel bash tamamlama işlemine apt-get iTabsahip olursunuz - örneğin , kaynak oluşturmadan yazıyorsanız , bash geçerli dizindeki dosyaları arar ive komutunuzu buna göre tamamlamaya çalışır. bu dosya adları.
Neden kök olarak gerçekleşmiyor?
Çünkü sudo sukendinizi yapmak için kullandığınızda root, bash tamamlama kütüphanesi kaynaklanmıyor. sudo -iKendiniz yaparsanız bu farklı olurdu root. Bahse girerim bug'u görürsün, değil mi? Örneğin, bkz. 'Sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - hangisinin ne zaman kullanıldığı önemli mi, yoksa hiç önemi var mı? Eğer farklılıkları bilmiyorsanız.
Benim durumumda, normal bir kullanıcı olarak, bir Bash kabuğuna başladığımda kütüphane kaynaklanıyor çünkü ~/.bashrckaynaklar /etc/bash_completionhangi kaynaklar /usr/share/bash-completion/bash_completion.
Eğer sudo -ioturum açmak için kullanırsam root, kütüphane kaynaklanır çünkü /etc/profilekaynaklar /etc/profile.d/bash_completion.shhangi kaynaklar /usr/share/bash-completion/bash_completion.
Bu hata neden oluyor?
Bu komutu yürütmeyi deneyin:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Tanıdık geliyor? ;-) Gerçekten de, Tabtanımladığınız bağlamda vurduğunuzda perde arkasında tam olarak olan buydu . Daha doğrusu, hata _quote_readline_by_reftarafından bildirilen işlevdedir /usr/share/bash-completion/bash_completion. Eğer o dosyayı kaynakladıysanız, o fonksiyonun mevcut olması gerekir. Şimdi şunu deneyin:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Bu argümanlar göz önüne alındığında, işlev _quote_readline_by_ref, diğer şeylerin yanı sıra, evalyukarıda belirtilenleri yerine getirir . İsterseniz bir göz atabilirsiniz. Ve yazdığınızda env $(cat env.Tab, bu fonksiyonun arkasında tam olarak bu argümanlarla çağrıldı. İşte böyle oldu.
Bu evalkesmek başka bir sorunu düzeltmek gerekiyordu , ama sanırım bu süreçte bu diğer hatayı tanıttı.
Nasıl düzeltebilirim?
Bu hatanın zaten bildirildiği ortaya çıktı . Bu hata raporunu okuduktan sonra düzeltmenin üç yolunu görüyorum:
Düzeltme eki: Bu hata raporundaki yorumlardan birinde, birisi satırı değiştirmenizi önerir
[[ ${!2} == \$* ]] && eval $2=${!2}
_quote_readline_by_refdosyadaki /usr/share/bash-completion/bash_completionsatır içinde fonksiyon içinde
[[ ${!2} == \$\'* ]] && eval $2=${!2}
Bunu yapmamanızı tavsiye ederim. Bu yorumu yazan kişi bash-tamamlama geliştiricisi gibi görünmüyor . Bu düzeltme, deyimin sol işleneninin false olarak değerlendirilmesine neden olur ve böylece bunun olmasını önler eval. Bununla birlikte, bu işlevin ne yapması gerektiği ve hangi bağlamlarda adlandırıldığı hakkında iyi bir bilgi olmadan, bunun potansiyel olarak başka bir amaçlanan işlevselliği bozmayacağı belirsizdir.
En yeni sürümü edinin: Bu hata raporunda da belirtildiği gibi, bu hata git head'ta mevcut değildir (burada diğer değişikliklerin yanı sıra fonksiyon _quote_readline_by_refbasitleştirilmiştir). Geçerli düzeltmeyi Git'ten klonlayabilirsiniz:
git clone https://salsa.debian.org/debian/bash-completion.git
... ve daha sonra bash_completionkomut dosyasının en yeni sürümünü kopyalayın /usr/share/bash-completion(sizi daha güvenli hissettirmedikçe eski sürümü yedeklemeye hiç gerek yok - bazı sorunlarla karşılaşırsanız, sudo apt-get install --reinstall bash-completionyaptığınız değişiklikleri geri almalısınız.) Bu şekilde bunu düzeltmek için acele ediyorsanız tavsiye edin. :-)
Bu çözümlerin hiçbirinin komut değiştirme işi içinde bash tamamlamasını yapmayacağını unutmayın: aynı hata raporunda belirtildiği gibi, bu Bash 4.3'te bozuldu.
- Arkanıza yaslanın ve bekleyin: Er ya da geç yeni bir sürüm çıkacak (hatta komut değiştirme içinde bash tamamlamayı bile düzeltebilir) ve gelecekteki Ubuntu sürümüyle birlikte alacaksınız. Ben bunun için gidiyorum ;-)