Ubuntu
Ubuntu 20.04 Shell - 按 TAB 顯示奇怪的“自動完成輸出”
我有一個奇怪的問題,真的不知道如何在 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
類似的修復。