我懂了 ”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_cwd
set
sudo opensnoop -n bash
显示名为 bash 的进程访问了哪些文件。
答案2
您的问题不在于命令本身。问题在于 PS1 中的 git 状态。简单来说,每次您提供命令时,PS1 都会被评估。为了显示 git 状态,当前工作目录中会执行一批命令。例如,它检查当前目录是否是 git repo,然后检查分支名称,可能是一些提交编号或您决定保留的状态。
我不太确定 Lauri 建议的解决方案是否会出现这样的评估,但您可以尝试一下。