bashの遅いオートコンプリートをデバッグして修正するにはどうすればよいですか?


26

最近の更新(Ubuntu 12.04 LTS)の後、コマンドラインでのTABの完了が遅くなります。部分的なコマンド(例evi [TAB])または部分的なファイル名(例evince somedocu[TAB])を入力した後、シェルは、常にではないが時々数秒間ハングします。

個人的には、遅いものよりも力の弱いオートコンプリートを好むでしょう。簡単な修正はありますか?

編集:コメントに関連する追加情報:

  • PATHはかなり標準です。〜/ binにはいくつかのbashスクリプトがあります

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
  • 作業ディレクトリ内のファイルの数は100未満です。

  • 異常なディスクアクティビティ(システムアップグレード)の後、オートコンプリート機能は特に遅くなりました。したがって、/ usr / binおよびその他のディレクトリを再読み込みすると、遅延が発生する可能性があります。

4
更新でハードドライブの速度管理を有効にし、オートコンプリートを計算できるようにディスクが起動するまでオートコンプリートが待機するのではないでしょうか。
ヴィンセントニヴォリエ

2
現在のディレクトリにあるファイルの数に依存しますか?
テルドン

1
#echo $ PATHの意味 パス内のディレクトリに多数(数万以上)のファイルがある場合、それが原因である可能性があります。
ステファン

回答:


28

修正については知りません。遅延を引き起こす可能性のあるすべての種類があります。しかし、調査するためのいくつかのヒントを提供できます。

推測通り、検索パスのどこかにディレクトリがあり($PATH、またはbashが完了データを探す場所)、応答が遅いファイルシステム上にある可能性があります。通常、遅いのはリモートファイルシステムですが、故障したハードディスク、ハングしたFUSEドライバなどの可能性もあります。

調査する最初のステップはset -x、完了を生成するためにシェルが実行するコマンドのトレースを取得するために実行することです。一時停止する場所に注意してください。

それで十分な情報が得られない場合は、大きな銃を持ってきてください。シェルのプロセスID(echo $$)に注意してください。別のターミナルで実行しますstrace -f -s9999 -p$$(別のUNIXフレーバーで実行している場合はstraceに相当)。Straceは、プロセスによって実行されるシステムコールをリストします。アクセスすべきでないファイルにアクセスしているように見えるか、または一部のファイルへのアクセスが遅いかどうかを確認します。コマンドラインにオプション-Tを追加straceすると、各システムコールに費やされた時間が表示されます。


1
私がUnixを使っていてset -x、知らなかった時間の長さ、なんてクールなコマンドか。非常に「ハッカーモードが
マットフレッチャー

6
Ps、set +x通常の非デバッグモードに戻るために使用
マットフレッチャー

19

* nixボックスがLDAPクライアントとして設定されている場合、ローカルユーザーとしてログインしていても、この問題が発生する可能性があります。

退屈なデバッグ情報:を使用したデバッグset-xでハングしていた完了が見つかりました:

> set -x
> ls foo<tab>
...                     <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]]      <--- froze here
+ [[ foo == ~* ]]       <--- actually causing the trouble

確認:ls ~*これも確認しましたが、ハングしました。私のLDAPサーバーは動作が遅いことがわかりましたが、これはbashの完了やlsなどには影響しないはずです!

解決策:ああ、bash-completion + ldapに対して提出されバグがあります。それは新しいバージョンで修正され、待ちたくない場合は簡単なパッチです。タブの補完が再び高速になりました。

リンクがなくなった場合のパッチファイルは次のとおりです。545行目と547行目で〜をエスケープしているだけです。

--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion  2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
     elif [[ $1 == \'* ]]; then
         # Leave out first character
         printf -v $2 %s "${1:1}"
-    elif [[ $1 == ~* ]]; then
+    elif [[ $1 == \~* ]]; then
         # avoid escaping first ~
-        printf -v $2 ~%q "${1:1}"
+        printf -v $2 \~%q "${1:1}"
     else
         printf -v $2 %q "$1"
     fi

このパッチを有効にするには、現在のsshセッションを終了して再ログインする必要があります。


1
私はこの正確な問題を抱えていたし、パッチが良いです
radman

2
ここで同じ問題(Debian 8.5)2 1/3年前とソリューションは魅力のように動作します。Debian 8.6には問題はありません。
ヨミスモ

2
私は百万回-xaセットを使用しました、まだ私はそれがために期待していなかっ完了パフォーマンスの問題を示して、どうもありがとう!
-MarcH

Debian 9.8でこの問題が発生しました!
フィリップガチョード

0

bash-completionを再インストールしてください

sudo apt-get install --reinstall bash-completion

私にとっては、これはUbuntu 18.04.3 LTSで修正されています


0

また、Git bash auto completeなどの追加の自動補完機能を使用する人もいます。Bashの完了の遅さは、これらの余分な自動完了機能の誤動作の結果である可能性があります。

私の場合、Git bashの自動完了でgit公開キーが更新されていたため、認証試行が失敗してハングが発生していました。オートコンプリートを削除すると、再び高速になりました。そのため、私の解決策は、キーを修正して再度有効にすることでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.