OS Xでbashの完了が非常に遅いのはなぜですか?


16

MacBook Proでbashの完了が非常に遅いのはなぜかわかりません。

私は次のことをしました~/.bash_profile

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

bash_completionの実行時間は通常2秒以上です。

ターミナルで作業しているときに、常に新しいタブを開く必要があるのは本当にうんざりしています。

これまたは何かをキャッシュする方法はありますか?

(注:iTerm2を使用していますが、これはMacの元の端末でも同様に遅いです)。


それは起こらないはずです。MacPortのbash補完を使用するのは正しいですか?
slhck

ロードするファイルはどのようなものですか?
ダニエルベック

@slhck:はい、私は確かにmacportのbashの補完機能を使用しています
disappearedng

@ダニエル:これを除いてすべてが問題ありません。ほとんどすべての行のプロファイルを作成しました。
消えた

5
私は同じ遅さを経験し、Homebrewを使用しています。
ブライス

回答:


10

短いバージョン:単一行を削除すると/usr/local/etc/bash_completion、新しいタブを開く時間が10秒から1/4秒に短縮されました。詳細をお読みください。

homebrewのbash-completionを使用していますが、同じ問題が発生しました。ターミナルを開くたびに、bash完了スクリプトをロードするのに10秒以上かかりました。

そのほとんどの時間は、have()関数内の1行(typeコマンドラインプログラムがインストールされているかどうかを判断するための呼び出し)で占められているようです。

デフォルトのhave()機能と提供されたすべてのbash完了スクリプトを使用すると、スクリプトをロードするのに10.561秒かかります(ファイルの行の先頭timeに追加することで報告されます)。. /opt/local/etc/bash_completion.bash_profile

スクリプトのPATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&行をコメントアウトした後/usr/local/etc/bash_completion(行を残してhave=yes、新しいターミナルを開くのにかかる時間はわずか0.258秒です。この時間は、/usr/local/etc/bash_completion.dディレクトリから不要な完了スクリプト(シンボリックリンク)を削除することでさらに短縮できます。

への呼び出しに時間typeがかかっている理由がわかりません。次に調査中です。

このアプローチの1つの潜在的な欠点は、bash補完関数を使用しなくてもメモリにロードされることです。このhave()関数は、コマンドまたはアプリケーションがインストールされているかどうかを確認します。そうでない場合、完了スクリプトは通常、役に立たないので自分自身をロードしないことにします。

現時点では、トレードオフに満足していますが、type時間がある限り、問題の調査を続けます。より良い解決策が見つかった場合は、回答を更新します。


私にとって、この行をコメントすると、50msの時間が230msから180msに短縮されます。もちろん、そもそもそんなに悪くはなかった。👍
エドワード・アンダーソン

これで約60ミリ秒しか削れなかったため、回避策を講じていません。10秒の待機時間はありませんが、2秒ほどで、少し面倒です。
-danemacmillan

7

MacOSの上に新しいシェルの起動時間は、彼らのために遅すぎるという結論に来る人にとって、これは解決策

を介してインストールできるパッケージが実際には2つあることを発見しましたbrew。私はbash-completion何年もパッケージをインストールしてきましたが、その間はBash 3から4に、そして今では5に移行しましたが、問題に悩むことはありませんでした。 、このまさにStackOverflowの議論にしばしば出くわします。

別のパッケージがありますbash-completion@2

違いは何ですか?bash-completionBashバージョン3.2用です。bash-completion@2Bashバージョン4.1+および5用です。

古いbash-completionパッケージを削除してインストールするbash-completion@2と、シェルの起動時間が605ミリ秒から244ミリ秒に短縮されました。これは速度の大幅な改善です。

brew info統計によると、前者には大量のインストールがあり、後者にはほとんどないことが示されているため、私たちの多くがこれと同じ間違いを犯していると思われます。

ここに画像の説明を入力してください

現在選択されている答えは、いくつかの行をコメントアウトすることに言及していることに注意してください。これは、起動時間をわずかに改善するだけです(bash-completionおそらく古いパッケージを使用している場合が多いでしょう)が、新しいbash-completion@2パッケージにはまったく影響を与えません:この新しいパッケージ何があっても速い つまり、ハッキングは必要ありません。

TL; DR:

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

.bashrcまたは.bash_profileファイル内の完了ファイルへのソースパスを更新することを忘れないでください。

ソース:


ある程度関連するトピックとして、私はrcloneユーティリティを頻繁に使用するため、インストールされています。また、私が今まで見た中で最大の補完ファイルを持っていることがあります。これを削除すると、シェルの起動時間が約120ミリ秒に短縮されます。これは非常に高速です。


編集:

この問題を説明する技術的な詳細が必要な場合は、Homebrewフォーラムで詳細に書いています。要約するbash-completion@2と、非常に高速である理由は、すべての完了ファイルを熱心にロードしないように作成されているためです。代わりに、完了ファイルをオンデマンドでロードするか、作成者が説明しているように、非熱心な方法でそれらをロードします。


macOSのデフォルトのBashバージョンはまだv3.2であると思います-Bash v4.2には同梱されていないと思います。macOSにはBash v4.2 +が同梱されていると書かれている参考文献がありますか?
-nwinkler

1
@nwinklerあなたは正しいでしょう。MacOSはまだに同梱されてversion 3.2.57(1)-release (x86_64-apple-darwin18)いるので、なぜ私がそれを言及したのか戸惑います。それを指摘してくれてありがとう。投稿から行を削除しました。
-danemacmillan

1
困惑、私は知っている...あなたの答えを更新していただきありがとうございます!
-nwinkler

3

godbykの答えが私に与えたアイデアで、PATH変数にはバイナリが存在しないか存在しないディレクトリがいくつかあり、それらを大幅に削除したことがわかりました。言い換えれば、これは私のbashrcにあったPATHです:

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

そして、それを次のように変更しました。

PATH="$GOPATH/bin:$PATH"

これはhave、そのbash補完の機能が各コマンドを検索し、それらのバイナリごとにアクセスされる無駄なディレクトリが多すぎるため、それらを高速化したためです。


また、PATH環境変数から存在しないパスを削除することで、ロード時間を約5秒から1秒未満に変更することができました。
ジュリエ

0

同じ問題がありました。いくつかの簡単なデバッグトリックが原因を突き止めました。

まず、DEBUG mode何が起きているのかを確認できるように有効にします。

export BASH_COMPLETION_DEBUG=true

これにより、コンソールへの詳細印刷が可能になるため、最後のコマンドを確認できます。これで、バックグラウンドでスクリプトを実行でき、何が起こっているのかがわかります。

. /opt/local/etc/bash_completion &

ではなく、またはでPIDトレースできます:pspstree

pstree -p <the PID>

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

ご覧のとおり、さびに関連するコマンドがいくつか開始されました。

一時的に削除すると/opt/boxen/homebrew/etc/bash_completion.d/cargo症状が解決しました。


-1

MacPorts> = 2.1.2およびMountain Lionを実行している場合、あなたbash_profileは間違っているようです。Mac OS Xでgit-completion.bashを動作させる方法の指示に従ってください。これにより、オートコンプリートを高速化できると思います。

別の解決策は、FinkまたはHomebrewを使用してオートコンプリートをインストールしてみることです。それがうまくいかない場合は、別のシェルを完全に試すことができます。オートコンプリート(初期状態)に関しては、Fishシェルが優れていることがわかりました。バージョン2はまだベータ版ですが、強くお勧めします。


-1

あなたのbashは古すぎると思います。マウンテンライオンに付属しているストックバッシュを実行しています。

$ 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.

このportコマンドが表示されません。:(どのgitタブ補完ソフトウェアが私のMacで実行されているかを知るにはどうすればよいですか?
ディーンヒラー

@DeanHillerこの回答は、portコマンドを提供するMacportsパッケージマネージャーに関するものです。MacPortsののbashの補完アプリはOS Xで提供さよりも新しいだろう
マットS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.