在 tcsh 中运行命令后,如何准确找到哪些文件已被访问?

在 tcsh 中运行命令后,如何准确找到哪些文件已被访问?

我如何找到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来询问)。

locatewhereis不会显示有用的数据,因为它们不使用相同的规则来查找文件tcsh

相关内容