在我的示例中,我开始输入sudo su dkay
... <tab>
...,命令挂起大约一分钟,然后 tab 完成到sudo su dkayton
。
有人建议我使用 strace 来了解发生了什么。
关于如何将制表符补全的底层命令传递给 strace 有什么想法吗?
我尝试过的:
我top
在一个 shell 中运行以监视进程。然后我立即sudo su dkay
在另一个 shell 中按下 Tab 键。
然后,我尽快复制了 bash 进程的 PID,生成了sudo strace -pXXX -tfo /tmp/strace.log
第三个 shell,其中 XXX 是复制的 PID。
它仍然成功捕获了超过 2mb 的日志。我重复了两次,第二次更成功。
我正在寻找一种更自动的方法来完成此任务。
答案1
(假设您使用的是 Linux)用于echo $$
获取当前 shell 的 PID。打开一个新终端,然后运行:
sudo strace -fp <PID> -o log
切换回旧 shell,尝试制表符补全。然后切换到新终端并按CtrlC结束strace
。输出将位于名为log
.您还可以strace
在同一 shell 中运行该命令(首先进行身份验证sudo
以缓存凭据):
sudo -v
sudo strace -fp $$ -o log &
然后尝试制表符补全。要杀死它,fg
,然后是CtrlC。
但是,如果您使用的是 bash,最好先尝试从中获取详细的调试输出:
set -o functrace xtrace
PS4=' ${BASH_SOURCE}:$FUNCNAME:$LINENO: '
然后尝试制表符补全。您应该在随后的输出中执行完成函数执行的所有内容。例如:
bash-5.0$ set -o xtrace functrace
bash-5.0$ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
+ PS4=' ${BASH_SOURCE}:${FUNCNAME}:$LINENO: '
bash-5.0$ sudo su /usr/local/share/bash-completion/bash_completion:_completion_loader:3: local cmd=sudo
/usr/local/share/bash-completion/bash_completion:_completion_loader:5: __load_completion sudo
/usr/local/share/bash-completion/bash_completion:__load_completion:2: dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:2: local -a dirs
/usr/local/share/bash-completion/bash_completion:__load_completion:3: local 'OIFS=
' IFS=: dir cmd=sudo compfile
/usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
/usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:2021: for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
/usr/local/share/bash-completion/bash_completion:__load_completion:5: dirs+=($dir/bash-completion/completions)
/usr/local/share/bash-completion/bash_completion:__load_completion:7: IFS='
'
/usr/local/share/bash-completion/bash_completion:__load_completion:9: [[ /usr/local/share/bash-completion/bash_completion == */* ]]