![set -x:在调试模式下工作时,制表符补全会导致输出混乱](https://linux22.com/image/128584/set%20-x%EF%BC%9A%E5%9C%A8%E8%B0%83%E8%AF%95%E6%A8%A1%E5%BC%8F%E4%B8%8B%E5%B7%A5%E4%BD%9C%E6%97%B6%EF%BC%8C%E5%88%B6%E8%A1%A8%E7%AC%A6%E8%A1%A5%E5%85%A8%E4%BC%9A%E5%AF%BC%E8%87%B4%E8%BE%93%E5%87%BA%E6%B7%B7%E4%B9%B1.png)
我知道这set -x
会让 Bash 用户进入调试模式,并且我觉得在调试模式下全职工作将帮助我更好地处理 Bash 中可能出现的问题。
我在使用时遇到问题set -x
:
当我尝试使用我的发行版(Ubuntu 16.04)的本机制表符完成来完成目录名称时,我得到一个非常长且混乱的输出。
例如,$PWD
我/var/www/html/
运行以下任一命令:
cd ~/u
[制表符补全完成u
至ulcwe
]
cd ~ && cd u
[制表符补全完成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
),但在执行选项卡完成时没有所有输出?
答案1
这是由于您正在使用的 shell 的可编程完成功能所致。
如果您对 中命令和文件名的基本制表符完成感到满意bash
,那么运行
complete -r
在您的~/.bashrc
意愿中删除任何涉及当前 shell 环境中调用函数等的“花哨”(可编程)完成。
关闭可编程完成后,基本文件名完成(就像您在问题示例中所做的那样)仍然有效。
可编程完成在某些 shell 中可用,并允许连接检查命令行状态等的回调函数,以找出用户接下来可能想要插入的可能字符串。例如,键入ssh
然后Space和Tab可能会调用一个函数来解析~/.ssh/config
文件以获取可能连接的主机名,或者键入git checkout
然后Space然后Tab可能会导致函数运行git
命令来找出当前存储库中可用的分支。
出于速度和/或生产力原因,某些用户依赖可编程完成,但是,是的,如果您set -x
在交互式 shell 会话中处于活动状态,这些操作将在终端中产生跟踪输出。
我从来都不是任何 shell 中可编程完成的朋友,因为我不希望简单的Tab按下来“在我背后施展魔法”以各种有趣的方式。我也觉得这有点偷懒,但这绝对只是我个人的看法。