Bash

set -x:在調試模式下工作時,製表符完成導致輸出混亂

  • February 28, 2018

我知道這set -x會讓 Bash 使用者進入調試模式,我覺得在調試模式下全職工作將幫助我更好地處理 Bash 中可能出現的問題。

我在使用時遇到問題set -x

當我嘗試使用我的發行版(Ubuntu 16.04)的本機選項卡完成來完成目錄名稱時,我得到一個很長、很亂的輸出。

例如,$PWDis/var/www/html/和我執行以下任一:

cd ~/u[tab完成完成uulcwe]

cd ~ && cd u[tab完成完成uulcwe]

在這兩個範例中,我都會得到一個非常長且混亂的輸出:

+ return 0
+ local -a toks
+ local quoted x tmp
+ _quote_readline_by_ref '~/u' quoted
+ '[' -z '~/u' ']'
+ [[ ~/u == \'* ]]
+ [[ ~/u == \~* ]]
+ printf -v quoted '~%q' /u
+ [[ ~/u == *\\* ]]
+ [[ ~/u == \$* ]]
++ compgen -d -- '~/u'
+ x='~/ulcwe'
+ read -r tmp
+ toks+=("$tmp")
+ read -r tmp
+ [[ -d != -d ]]
+ [[ -n '' ]]
+ [[ 1 -ne 0 ]]
+ compopt -o filenames
+ COMPREPLY+=("${toks[@]}")
+ return 0
lcwe/

注意lcwe最後。

上述輸出只是更大輸出的一部分。

我怎樣才能在調試模式下全職工作(set -x)但在執行製表符完成時沒有所有輸出?

這是由於您正在使用的 shell 的可程式完成功能。

如果您對 中的命令和文件名的基本製表符完成感到滿意bash,那麼執行

complete -r

在您~/.bashrc將刪除任何涉及在目前 shell 環境中呼叫函式等的“花哨”(可程式)完成。

關閉可程式完成後,基本文件名完成(就像您在問題範例中所做的那樣)仍然有效。

可程式完成在某些 shell 中可用,它允許連接回調函式來檢查命令行的狀態等,以找出使用者可能想要插入的下一個字元串可能是什麼。例如,鍵入and sshthen可能會呼叫一個函式,該函式會解析您的文件以查找可能要連接的主機名,或者鍵入then並可能導致函式執行命令來確定目前儲存庫中可用的分支。Space``Tab``~/.ssh/config``git checkout``Space``Tab``git

一些使用者出於速度和/或生產力的原因依賴可程式完成,但是是的,如果您set -x在互動式 shell 會話中處於活動狀態,這些操作將在終端中產生跟踪輸出。


我從來都不是任何 shell 中可程式完成的朋友,因為我不希望一個簡單的按下以各種有趣的方式Tab“在我背後變魔術” 。我也認為這有點懶惰,但這絕對只是我個人的看法。

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