如何调查更改目录时运行的命令?

如何调查更改目录时运行的命令?

我懂了 ”awk”,“寻找”,“sed“, 和 ”哪个”在更改目录时会瞬间出现在我的终端窗口的标题中。  (并且并非所有这些都会出现,并且可能有一些我遗漏了;我想这是因为标题在 UI 重新绘制之前发生了多次变化。)

虽然这可能只是我一路上安装的一些 shell 脚本和附加组件(可能是 PS1 中的 git status),我想调查一下,以确保。有没有简单的方法可以找出调用这些脚本的脚本?

上下文注释:我正在寻找一种通用的调查方法来发现调用子命令的原因。我的程序员思维让我想要一个解决方案,可以暂时用存根命令替换子命令(在#define/ #undef这会转储调用点的堆栈跟踪,然后调用原始命令或直接中止。这种方法可能适用于也可能不适用于 shell。

还:我主要在 OS X 10.8 上使用 GNU bash 3.2.48。我不确定系统和 bash 版本是否与当前问题完全相关——如果能有一个适用于我的 Debian 实例的解决方案就好了。

答案1

使用 bash 您可以使用set -o verbose

$ set -o verbose
update_terminal_cwd; 
$ cd ~/Documents
cd ~/Documents
update_terminal_cwd; 

bash -lv将启动一个启用了相同选项的新登录 shell。

例如,update_terminal_cwd在 中定义,但 Spotlight 未对其进行索引。但您可以使用或/etc/bashrc来查看定义。declare -f update_terminal_cwdset

sudo opensnoop -n bash显示名为 bash 的进程访问了哪些文件。

答案2

您的问题不在于命令本身。问题在于 PS1 中的 git 状态。简单来说,每次您提供命令时,PS1 都会被评估。为了显示 git 状态,当前工作目录中会执行一批命令。例如,它检查当前目录是否是 git repo,然后检查分支名称,可能是一些提交编号或您决定保留的状态。

我不太确定 Lauri 建议的解决方案是否会出现这样的评估,但您可以尝试一下。

相关内容