我如何找到tcsh
读取哪些文件来TAB
完成命令的第二个单词,而不是第一个单词。
我知道我可以用来whereis complete
查看文件的路径*.1.gz
,但这还不够具体,无法说明正在使用哪些文件。
另一方面,如果我使用locate complete
,我会得到一个包含数百个文件的列表,其中许多文件不可执行。
答案1
我会用strace
捕获整个会话,并通过浏览脚本输出来获取键盘读取,然后找到此后的所有开放调用。这适用于 Linux 和其他一些系统。 BSD 也有类似的痕迹(MacOS 则不同)。
然而,tcsh 可能不是开幕文件,但从目录中列出它们。 strace 也会对此有所帮助。例如,在快速检查中,我看到它使用打开当前目录openat
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
然后使用lstat
函数来确定感兴趣的条目是什么(以便它可以对它们进行排序,决定哪些是文件还是目录等):
lstat("xterm.desktop", {st_mode=S_IFREG|0444, st_size=1921, ...}) = 0
这“。”是当前目录。该程序读取目录条目列表,其中可能是文件、目录、符号链接等,但这些条目没有排序(并且类型未知,直到它使用stat
/lstat
来询问)。
locate
和whereis
不会显示有用的数据,因为它们不使用相同的规则来查找文件tcsh
。