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 i
Tabyazdığınızda bunu tamamlayacaktır apt-get install
. Bu kütüphaneyi kaynaklamazsanız, yalnızca standart, ilkel bash tamamlama işlemine apt-get i
Tabsahip olursunuz - örneğin , kaynak oluşturmadan yazıyorsanız , bash geçerli dizindeki dosyaları arar i
ve komutunuzu buna göre tamamlamaya çalışır. bu dosya adları.
Neden kök olarak gerçekleşmiyor?
Çünkü sudo su
kendinizi yapmak için kullandığınızda root
, bash tamamlama kütüphanesi kaynaklanmıyor. sudo -i
Kendiniz 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ü ~/.bashrc
kaynaklar /etc/bash_completion
hangi kaynaklar /usr/share/bash-completion/bash_completion
.
Eğer sudo -i
oturum açmak için kullanırsam root
, kütüphane kaynaklanır çünkü /etc/profile
kaynaklar /etc/profile.d/bash_completion.sh
hangi 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_ref
tarafı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, eval
yukarı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 eval
kesmek 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_ref
dosyadaki /usr/share/bash-completion/bash_completion
satı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_ref
basitleştirilmiştir). Geçerli düzeltmeyi Git'ten klonlayabilirsiniz:
git clone https://salsa.debian.org/debian/bash-completion.git
... ve daha sonra bash_completion
komut 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-completion
yaptığı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 ;-)