Bashで遅いオートコンプリートをデバッグして修正する方法は?

Bashで遅いオートコンプリートをデバッグして修正する方法は?

最近のアップデート(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やその他のディレクトリを再度読み込むと、遅延が発生する可能性があります。

答え1

問題を解決する方法がわかりません。遅延を引き起こす可能性のあるすべての種類があります。しかし、調査のためにいくつかの提案をすることができます。

推測するには、検索パスにあるディレクトリの1つ($PATHまたはbashが完了データを探している場所)が応答が遅いファイルシステムに存在する可能性があります。通常、リモートファイルシステムは遅いですが、ハードドライブのエラー、FUSEドライバの停止などが原因である可能性があります。

調査の最初のステップは、set -xシェルの実行を追跡して完了を生成するコマンドを実行することです。どこで止まるのを見てください。完了したら、トレースオフを使用してくださいset +x

情報が足りない場合は、大きな銃を入手してください。シェルのプロセスID(echo $$)を書き留めます。他の端末でstrace -f -s9999 -p$$以下を実行します。ストレス他のUnixバージョンで実行している場合)。 Straceは、プロセスで実行されたシステムコールを一覧表示します。アクセスしてはいけないファイルにアクセスしているようであるか、特定のファイルへのアクセスが遅いかどうかを確認してください。コマンドライン-Tにオプションを追加すると、各システムコールに費やされた時間を表示できます。strace

答え2

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

退屈なデバッグ情報:debug を使用して、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セッションからログアウトしてから再度ログインする必要があります。

答え3

私はあなたを確認することをお勧めしますシステムオーディオうまくいきます。端末の着信音が正しく再生されないため、一時的な停止が発生する可能性があります。例: PulseAudio Daemon がクラッシュしたり、正しく動作しない。

私の端末で初めてTabキーを押すと、数秒間停止します。その後は大丈夫でしょう。これは、端末からすべてのテキストを削除してバックスペースキーを押した場合にも発生します。

私は上記のすべてを試しましたが、成功しませんでした。

ターミナルの着信音をオフにする

Ctrl+ Alt+ T--> 編集 --> 基本設定 --> {ユーザープロファイル、一般的に名前が付けられていません} --> テキスト --> サウンド --> 選択解除ターミナル着メロ

答え4

もう1つの戦略は、Bash設定ファイルをチェックし、すべての完成機能を無効にすることです。その後、より速いかどうかをテストします。高速でない場合は、低速(リモート)ディスクに関連している可能性があります。ただし、速度が速い場合は、遅い原因が見つかるまで少しずつ完了を有効にできます。

私は/etc/bash.bashrc次のような部分があることを発見しました。

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

私の地域とまったく同じです~/.bashrc。そのため、完成コードが2回含まれ、あいまいなディレクトリ名を部分的に完成すると、なぜか速度が速くなります。

関連情報