set -x:在調試模式下工作時,製表符完成導致輸出混亂
我知道這
set -x
會讓 Bash 使用者進入調試模式,我覺得在調試模式下全職工作將幫助我更好地處理 Bash 中可能出現的問題。我在使用時遇到問題
set -x
:當我嘗試使用我的發行版(Ubuntu 16.04)的本機選項卡完成來完成目錄名稱時,我得到一個很長、很亂的輸出。
例如,
$PWD
is/var/www/html/
和我執行以下任一:
cd ~/u
[tab完成完成u
到ulcwe
]
cd ~ && cd u
[tab完成完成u
到ulcwe
]在這兩個範例中,我都會得到一個非常長且混亂的輸出:
+ 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
ssh
then可能會呼叫一個函式,該函式會解析您的文件以查找可能要連接的主機名,或者鍵入then並可能導致函式執行命令來確定目前儲存庫中可用的分支。Space``Tab``~/.ssh/config``git checkout``Space``Tab``git
一些使用者出於速度和/或生產力的原因依賴可程式完成,但是是的,如果您
set -x
在互動式 shell 會話中處於活動狀態,這些操作將在終端中產生跟踪輸出。我從來都不是任何 shell 中可程式完成的朋友,因為我不希望一個簡單的按下以各種有趣的方式
Tab
“在我背後變魔術” 。我也認為這有點懶惰,但這絕對只是我個人的看法。