我希望能够统计我通过 bash 运行最多的程序。有没有办法在 bash 中插入某种钩子,以便它记录它执行的所有内容?
请注意,仅查看 bash 历史文件还不够。我可以从历史记录的每一行中打印出第一个标记,但这不会获得管道和进程替换。我想要以下内容:
$ ls /usr/bin/* | fgrep $(echo grep)
Run Code Online (Sandbox Code Playgroud)
记录ls
、fgrep
、 和echo
分别运行一次。以及以下内容:
$ for file in /usr/bin/*; do stat $file; echo $file; done
Run Code Online (Sandbox Code Playgroud)
应注意stat
并echo
运行。由于for
是 bash 流程控制语句,因此不会被记录。
是否应该记录 shell 内置函数和函数是有争议的(也许只是记录它们的内容)。stat
在上面的示例中,是否echo
应该记录一次或多次运行循环也存在争议。但我可以以最简单的方式处理输出。
运行 bash-x
显示它确实有一些内部机制来挂钩进程exec
并记录正在发生的事情。还有其他方法可以进去吗?
作为第一切,
strace -e execve -b execve -f -qqv -e signal='!all' bash
Run Code Online (Sandbox Code Playgroud)
对于非smoketest使用,您必须将stderr重定向到某个记录器管道,或者使用strace的文件在某个糟糕的目录中乱扔垃圾-o
,也许-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$
要对所有交互式 shell 执行此操作,我认为您需要一个保护变量.bashrc
来避免递归。
归档时间: |
|
查看次数: |
974 次 |
最近记录: |