Bash tamamlama neden OS X'te bu kadar yavaş yükleniyor?


16

MacBook Pro'mda bash tamamlamanın neden bu kadar yavaş yüklendiğini anlamıyorum.

Bende aşağıdakileri yaptım ~/.bash_profile:

echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."

bash_completion için yürütme süresi tipik olarak> 2 saniyedir.

Sürekli yeni sekmeler açmamı gerektiren terminal üzerinde çalışırken bunu gerçekten sinir bozucu buluyorum.

Bunu önbellekleyebilmemin bir yolu var mı?

(İTerm2 kullanıyorum ve bu da Mac'teki orijinal terminalde eşit derecede yavaş).


Bu olmamalı. MacPort'un bash tamamlamasını kullandığınızdan emin miyim?
slhck

Yüklediğiniz dosya neye benziyor?
Daniel Beck

@slhck: Evet gerçekten macport'un bash tamamlamasını kullanıyorum
disappearedng

@Daniel: Bunun dışında her şey yolunda. Neredeyse her çizgiyi seçtim.
disappearedng

5
Aynı yavaşlığı yaşıyorum ve Homebrew kullanıyorum.
Brice

Yanıtlar:


10

Kısa sürüm: Tek bir satırın kaldırılması, /usr/local/etc/bash_completionyeni bir sekme açma süresini on saniyeden saniyenin dörtte birine indirdi. Ayrıntılar için okumaya devam edin.

Homebrew gelen bash-completion kullanıyorum ve aynı sorunla karşılaştı. Her terminal açtığımda, bash tamamlama komut dosyalarının yüklenmesi on saniyeden fazla sürüyordu.

Çoğu zaman, have()fonksiyondaki tek bir satır tarafından alınır gibi görünüyor : typebir komut satırı programının yüklü olup olmadığını belirlemek için bir çağrı .

Varsayılan ile have()işlev ve yerinde sağlanan bash tamamlama komut tüm bu önek olarak bildirilen komut dosyaları yüklemeye 10.561s (alacaktı timeiçin . /opt/local/etc/bash_completionbenim de hat .bash_profiledosyası.

Betiğimin PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&satırını yorumladıktan sonra /usr/local/etc/bash_completion( have=yessatırdan çıkarken, yeni bir terminal açmak sadece 0.258 saniye sürer. Bu süre, dizinden gereksiz tamamlama komut dosyaları (semboller) kaldırılarak daha da azaltılabilir /usr/local/etc/bash_completion.d.

Çağrının neden bu typekadar uzun sürdüğünü bilmiyorum . Bundan sonra araştırıyorum.

Bu yaklaşımın potansiyel bir dezavantajı, bash tamamlama işlevlerinin, kullanımınız olmasa bile belleğe yüklenmesine neden olmasıdır. have()Bir komut veya uygulama yüklüyse işlev denetler. Değilse, tamamlama komut dosyası genellikle yüklemeyi rahatsız etmemeye karar verir, çünkü işe yaramayacaktır.

Şu anda ödünleşmeden memnunum ama zamanım geldiğinde typesorunu araştırmaya devam edeceğim. Daha iyi bir çözüm bulursam cevabımı güncelleyeceğim.


Benim için, bu çizgiyi yorumlamak 230ms'den 180ms'ye 50ms zamanı azaltır. Tabii ki ilk etapta hiç bu kadar kötü olmamıştım. 👍
Edward Anderson

Bu sadece yaklaşık 60 ms tıraş, bu yüzden geçici çözüm tutmadım. On saniye bekleme sürem yok, ama hafifçe rahatsız edici olan yaklaşık 2s.
danemacmillan

7

MacOS yeni kabuklar için başlatma süreleri onlar için çok yavaş olduğu sonucuna varmaya herkes için, bu çözüm .

Sadece üzerinden kurulabilen iki paket olduğunu keşfettim brew. Ben yükleme oldum bash-completionbile, ben bir problemi tekrar ediyorum, Zaman zaman şimdi 5'e kadar, 4'e, bu süre içinde ben Bash 3 geçmemize rağmen bunu sorgulamaya asla rahatsız yıllardır paketi ve , genellikle bu StackOverflow tartışmasını tökezledi.

Başka bir paket daha var bash-completion@2!

Fark ne? bash-completionBash 3.2 sürümü içindir. bash-completion@2Bash sürüm 4.1+ ve 5 içindir.

Eski bash-completionpaketi kaldırırken ve yüklerken bash-completion@2, kabuk başlatma sürelerim 605ms'den 244ms'ye düştü. Bu büyük bir hız artışı.

brew infoİstatistiklerin birincisinin tonlarca yüklemeye sahip olduğunu gösterdiği gibi, ikimizin de aynı hatayı yaptığından şüpheleniyorum ;

resim açıklamasını buraya girin

Unutulmamalıdır akım seçilen yanıt (eski kullanılıyorsa kez devreye almadan sadece hafif bir iyileşme sağlar bazı çizgiler, dışında yorum bahseder bash-completionbirçok muhtemelen paketi), ancak yeni üzerinde hiçbir etkisi yoktur bash-completion@2paketin: Bu yeni bir paket ne olursa olsun hızlı. Bu, herhangi bir saldırıya gerek olmadığı anlamına gelir.

TL; DR:

brew uninstall bash-completion && brew install bash-completion@2

.bashrcVeya .bash_profiledosyanızdaki tamamlama dosyasının kaynak yolunu güncellemeyi unutmayın .

Kaynaklar:


Biraz ilgili bir konu olarak, rcloneyardımcı programı çok kullanıyorum, bu yüzden yüklü. Ayrıca şimdiye kadar gördüğüm en büyük tamamlama dosyasına sahip . Bunu kaldırmak benim kabuk başlangıç ​​zamanlarımı ~ 120 ms'ye düşürür, ki bu çok hızlıdır.


Düzenle:

Bu sorunu açıklayan teknik ayrıntıları isteyen herkes için, bu konuyu Homebrew forumlarında uzun süre yazdım . Özetlemek gerekirse, bash-completion@2çok daha hızlı olmasının nedeni, tüm tamamlama dosyalarını artık hevesle yüklememesi için yazılmış olmasıdır ; bunun yerine isteğe bağlı olarak bir tamamlama dosyası yükler veya yazarın açıkladığı gibi, dosyaları istekli olmayan bir şekilde yükler .


MacOS'ta varsayılan Bash sürümünün hala v3.2 olduğunu düşünüyorum - Bash v4.2 ile birlikte geldiğini sanmıyorum. MacOS'un Bash v4.2 + ile birlikte geldiğini belirten bir referansınız var mı?
nwinkler

1
@nwinkler Doğru olurdunuz. Neden bahsettiğime şaşkınım, çünkü MacOS hala birlikte geliyor version 3.2.57(1)-release (x86_64-apple-darwin18). Bunu işaret ettiğiniz için teşekkürler; Çizgiyi yazımdan kaldırdım.
danemacmillan

1
Şaşkınlık, biliyorum ... Cevabınızı güncellediğiniz için teşekkürler!
nwinkler

3

Godbyk cevabının bana verdiği fikirle, PATH değişkenimin ikili olmayan veya var olmayan birkaç dizini olduğunu buldum, onları kaldırmak önemli ölçüde hızlandırdı. Başka bir deyişle, bu benim bashrc vardı YOL:

PATH="$GOPATH/bin:/some/directory/not/existing:/some/empty/directory:/some/directory/without/binaries:$PATH"

Ve sonra onu şöyle değiştirdim:

PATH="$GOPATH/bin:$PATH"

Bunun nedeni have, o bash tamamlama işlevinin her komutu aramasıydı ve her bir ikili için ziyaret edilecek çok fazla işe yaramaz dizinim vardı, onları kaldırarak hızlandırdı.


Ayrıca PATH ortam değişkenimde mevcut olmayan yolları kaldırarak yükleme süresini yaklaşık 5 saniyeden 1 saniyeden daha azına değiştirmeyi başardım.
juriejan

0

Aynı sorunu yaşadım. Birkaç basit hata ayıklama püf noktası beni temel nedene götürdü.

İlk olarak, DEBUG modeneler olduğunu görebilmeniz için etkinleştirin :

export BASH_COMPLETION_DEBUG=true

Bu, konsola ayrıntılı yazdırmayı mümkün kılar, böylece son komutu görebilirsiniz. Artık betiği arka planda yürütebilirsiniz ve neler olduğunu göreceksiniz

. /opt/local/etc/bash_completion &

Değil alın PIDsonra ile takip edebilirsiniz hangi psya pstree:

pstree -p <the PID>:

| |     \-+= 82095 mfellows -bash
| |       \-+- 82103 mfellows -bash
| |         |-+- 82104 mfellows cargo --list
| |         | \--- 82106 mfellows rustc -vV --cap-lints allow

Gördüğünüz gibi, yaşlanan pasla ilgili bazı komutlar başlattı.

Geçici olarak kaldırmak /opt/boxen/homebrew/etc/bash_completion.d/cargosemptomlarımı çözdü.


-1

MacPorts> = 2.1.2 ve Mountain Lion kullanıyorsanız bash_profile, yanlış görünmektedir . Talimatları izleyin , Mac OS X üzerinde çalışmaya git-completion.bash almak nasıl? . Bunun otomatik tamamlamayı hızlandırabileceğini düşünüyorum.

Başka bir çözüm, Fink veya Homebrew aracılığıyla otomatik tamamlamayı yüklemeyi denemek olacaktır . Bu işe yaramazsa, tamamen başka bir kabuk deneyebilirsiniz. Otomatik tamamlama söz konusu olduğunda (kutunun dışında) Balık kabuğunun olağanüstü olduğunu gördüm . Sürüm 2 hala beta olmasına rağmen kesinlikle tavsiye.


-1

Sanırım bashın çok yaşlı. Mountain Lion ile birlikte gelen stok bash çalıştırıyorum ve işte gördüğüm:

$ port info bash-completion
bash-completion @2.0, Revision 1 (sysutils)

Description:          Programmable completion library for bash. This port
                      **requires bash >=4.1** and is meant to be used together with
                      the bash port.
Homepage:             http://bash-completion.alioth.debian.org/

Runtime Dependencies: bash
Conflicts with:       bash-completion-devel
Platforms:            darwin
License:              GPL-2+
Maintainers:          raimue@macports.org

$ bash --version
GNU bash, version **3.2.48(1)-release (x86_64-apple-darwin12)**
Copyright (C) 2007 Free Software Foundation, Inc.

Bu bağlantı noktası komutunu göremiyorum. :( Macimde hangi git sekmesi tamamlama yazılımının çalıştığını nasıl öğrenebilirim
Dean Hiller

@DeanHiller Bu yanıt port komutunu sağlayan Macports paket yöneticisine başvuruyor. Macports'un bash tamamlama uygulaması OS X ile sağlanandan daha yeni olacak.
Matt S
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.