set -x:在调试模式下工作时,制表符补全会导致输出混乱

set -x:在调试模式下工作时,制表符补全会导致输出混乱

我知道这set -x会让 Bash 用户进入调试模式,并且我觉得在调试模式下全职工作将帮助我更好地处理 Bash 中可能出现的问题。

我在使用时遇到问题set -x

当我尝试使用我的发行版(Ubuntu 16.04)的本机制表符完成来完成目录名称时,我得到一个非常长且混乱的输出。

例如,$PWD/var/www/html/运行以下任一命令:

cd ~/u[制表符补全完成uulcwe]

cd ~ && cd u[制表符补全完成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),但在执行选项卡完成时没有所有输出?

答案1

这是由于您正在使用的 shell 的可编程完成功能所致。

如果您对 中命令和文件名的基本制表符完成感到满意bash,那么运行

complete -r

在您的~/.bashrc意愿中删除任何涉及当前 shell 环境中调用函数等的“花哨”(可编程)完成。

关闭可编程完成后,基本文件名完成(就像您在问题示例中所做的那样)仍然有效。

可编程完成在某些 shell 中可用,并允许连接检查命令行状态等的回调函数,以找出用户接下来可能想要插入的可能字符串。例如,键入ssh然后SpaceTab可能会调用一个函数来解析~/.ssh/config文件以获取可能连接的主机名,或者键入git checkout然后Space然后Tab可能会导致函数运行git命令来找出当前存储库中可用的分支。

出于速度和/或生产力原因,某些用户依赖可编程完成,但是,是的,如果您set -x在交互式 shell 会话中处于活动状态,这些操作将在终端中产生跟踪输出。


我从来都不是任何 shell 中可编程完成的朋友,因为我不希望简单的Tab按下来“在我背后施展魔法”以各种有趣的方式。我也觉得这有点偷懒,但这绝对只是我个人的看法。

相关内容