Ubuntu 20.04 Shell - TABを押すと、奇妙な「オートコンプリート出力」が表示されます。

Ubuntu 20.04 Shell - TABを押すと、奇妙な「オートコンプリート出力」が表示されます。

奇妙な問題がありますが、StackExchangeで同様の質問を検索する方法がわかりません。

これはに関連していますUbuntu 20.04 command-line

キーを押すと、TABAutoCompleteは「現在のコマンドへの入力」の一部として非常に奇妙な結果を追加します。

たとえば、

Typing: (cd and pressing TAB afterwards)
....
cd words=("${@:3:2}")
cword="$3"
cur="$3"
cur="$3"
cword="$3"
prev="$3"
words=("${@:3:2}")
stage^C

タイプするときも同様bash + TAB

bash words=("${@:3:2}")
cword="$3"
cur="$3"
cur="$3"
cword="$3"
prev="$3"
words=("${@:3:2}")
^C

最近、シェルのオートコンプリート機能が奇妙に機能していますが、どのように解決するのかわかりません。 (もう一度お詫び申し上げます。私はこの質問を適切に表現する方法がわからず、同様の質問も見つかりません。)

メモ:

resetコンソールだけをクリアしましたが、その後も問題は続きます!

答え1

私はあなたのシェルがBashであると仮定します。eval次のようにオーバーライドして問題を再現できます。

eval() { echo "$1"; }

または同様です。完了機能が使用されますevalevaleval これケース内蔵。eval操作すると誤動作することがあります。

私のテストでは、evalエイリアスや実行可能ファイルになっても完了は中断されないため、あなたの場合は関数である可能性が高くなります。

移動する

type eval

通常、出力は次のようになりますeval is a shell builtineval is a function

unset -f eval

完了がよりよく行われているか(または少なくとも別の方法で)確認してください。

この機能がどこから来たのかを調べる必要があります。手動の方法はスタートアップファイル(~/.bashrc など。)そして彼らが購入するすべて。より良い方法があります。次のように進んでください。

shopt -s extdebug   # enable extra debugging info
declare -F eval

これにより、行番号とソースファイルが表示されます。 (shopt -u extdebugデバッグを無効にするには、最後に実行してください。)

上記の方法は、関数定義を見つけるのに十分でなければなりません。場合に備えて、次のような他の方法があります。Bash機能を定義するファイルを見つける方法

関数の定義が見つかったら、それを削除して組み込み関数evalにします。evalメモ:

  • 定義を削除しても、すでに実行中のシェルは自動的には回復されません。新しいシェルを作成して疑わしい場合は、ログインしてください。
  • 定義を削除すると、実際に関数を必要とするすべてが中断されるため、追加の調査が必要になる場合があります。関数が存在するのはなぜですか?定義のコードを拡張できない場合は、削除(少なくとも最初は一時的)ではなく名前を変更することをお勧めします。
  • 関数は複数回定義できます(最も近いソースの定義が優先されます)。定義を削除しても組み込み機能が復元されない場合は、定義が残っている可能性があります。方法を繰り返します。

完了が完全に修正されていない場合は、出力を確認し、declare -F組み込み機能を置き換える他の機能があることを確認してください(使用compgen -b何を探すべきかがわかります)。必要に応じて、今行ったように分析し、eval同様の修理を行います。

答え2

空白を見逃してset -o vi入力したときにこれが起こりましたset -ovi。これにより、bashの組み込みセットがvsetに送信された別のオプションとして解釈されます。 ~からGNU マニュアルページセット:

-vシェル入力行を読み取ったとおりに印刷します。

システムからログアウトすると別の症状が表示され、画面に次の内容が表示されます。

logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

関連情報