Ubuntu

Ubuntu 20.04 Shell - 按 TAB 顯示奇怪的“自動完成輸出”

  • April 7, 2021

我有一個奇怪的問題,真的不知道如何在 StackExchange 上搜尋類似的問題。

這與Ubuntu 20.04 command-line.

當我按下TAB鍵時,“自動完成”會附加非常奇怪的結果作為“我目前命令的輸入”的一部分。

例如:

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

Shell 自動完成最近的行為很奇怪,不知道如何解決這個問題。(再次道歉,我真的不知道如何正確表達這一點,甚至找不到類似的問題)。

筆記:

reset只清除控制台,但問題仍然存在!

我假設你的外殼是 Bash。我可以通過像這樣重新定義來複製您的問題eval

eval() { echo "$1"; }

或類似的。完成函式使用eval. 他們希望eval成為內置eval shell。如果eval被篡改,那麼他們可能會行為不端。

我的測試表明,eval作為別名或執行檔不會破壞完成,因此在您的情況下它很可能是一個函式。

呼叫

type eval

通常輸出應該是eval is a shell builtin. 如果你得到eval is a function然後呼叫

unset -f eval

並檢查完成是否表現更好(或至少不同)。

您應該調查函式的來源。一種手動方法是檢查啟動文件(~/.bashrc 等等)及其來源的所有內容。有更好的方法。像這樣進行:

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

這將告訴您行號和源文件。(最後執行shopt -u extdebug禁用調試。)

上面的方法應該足夠定位函式的定義了。以防萬一,這裡很少有其他方法:如何找到定義 bash 函式的文件

找到這個eval函式的定義後,把它去掉,讓它eval成為內置函式。筆記:

  • 刪除定義不會自動修復已經執行的 shell。產生一個新的外殼;註銷並登錄;如有疑問,請重新啟動。
  • 刪除定義會破壞任何實際需要該功能的東西,因此可能需要進一步調查:該功能存在的原因是什麼?考慮重命名而不是刪除(至少最初是暫時的),以防定義中的程式碼不可消耗。
  • 該函式可能被多次定義(並且最近獲得的定義獲勝)。如果刪除定義不會帶回內置函式,則可能還剩下一個定義。重複該方法。

如果完成沒有完全修復,請檢查輸出declare -F並檢查替換內置函式的其他函式(用於compgen -b了解要搜尋的內容)。如果需要,可以像剛才那樣分析它們並進行eval類似的修復。

引用自:https://unix.stackexchange.com/questions/643955