osx dtruss 在跟踪 bash 时不报告打开 ~/.bash_profile?

osx dtruss 在跟踪 bash 时不报告打开 ~/.bash_profile?

假设我的开头有这一行~/.bash_profile

echo "*** THIS IS ~/.bash_profile RUNNING ***"

在 Linux 计算机 (Ubuntu 14.04) 上,我可以使用 检查bash启动时加载的文件strace,因此我这样做:

strace -f bash --login 2>&1 | tee /tmp/log.strace
# type [ENTER] here, or "hello" [ENTER], then Ctrl+C to exit
grep 'bash_' /tmp/log.strace

结果如预期:

faccessat(AT_FDCWD, "/etc/profile.d/bash_completion.sh", R_OK) = 0
open("/etc/profile.d/bash_completion.sh", O_RDONLY) = 3
open("~/.bash_profile", O_RDONLY) = 3
read(3, "echo \"*** THIS IS ~/.bash_profil"..., 48) = 48
write(1, "*** THIS IS ~/.bash_profile RUNN"..., 40*** THIS IS ~/.bash_profile RUNNING ***

但是,我已经通过 登录了 OSX 10.9 计算机ssh,并且我需要执行相同的操作。由于 OSX 上没有strace,我使用了dtruss,如下所示:

dtruss -f bash --login 2>&1 | tee /tmp/log.dtruss
# type [ENTER] here, or "hello" [ENTER], then Ctrl+C to exit
grep 'bash_' /tmp/log.dtruss

奇怪的是,似乎没有提到~/.bash_profile曾经被加载过:

$ grep 'bash_' /tmp/log.dtruss
$

..., - 即使,如果我只是bash --login在那台 OSX 机器上运行,我可以看到上面的内容echo正在打印,这意味着~/.bash_profile必须加载?!

当然,dtruss是否报告访问其他文件:

$ grep 'open\|stat' /tmp/log.dtruss 
41819/0xce5a2:  stat64("/AppleInternal\0", 0x7FFF5CBC2A88, 0x0)      = -1 Err#2
41819/0xce5a2:  stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x7FFF5CBC23F8, 0x7FFF5CBC3330)         = 0 0
41819/0xce5a2:  open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0)         = 3 0
41819/0xce5a2:  stat64("/usr/lib/libncurses.5.4.dylib\0", 0x7FFF5CBC2208, 0x7FFF5CBC30A0)        = 0 0
...
41819/0xce5a2:  open("/dev/tty\0", 0x6, 0x7FFF79D33940)      = 3 0
41819/0xce5a2:  open_nocancel("/usr/share/locale/en_US.UTF-8/LC_COLLATE\0", 0x0, 0x1B6)      = 3 0
...
41819/0xce5a2:  stat64("~/.fastlane/bin/bash\0", 0x7FFF5CBC37E0, 0x0)        = -1 Err#2
41819/0xce5a2:  stat64("/usr/bin/bash\0", 0x7FFF5CBC37E0, 0x0)       = -1 Err#2
41819/0xce5a2:  stat64("/bin/bash\0", 0x7FFF5CBC37E0, 0x0)       = 0 0
41819/0xce5a2:  stat64("/bin/bash\0", 0x7FFF5CBC3820, 0x0)       = 0 0
...

...,例如,我们可以看到该$HOME目录作为搜索的一部分被访问$PATH(事实上,PATH="~/.fastlane/bin:$PATH" 设定完全相同~/.bash_profile)。

我的问题是 - 为什么会发生这种情况?是否有dtruss我需要使用的特殊调用,以便它在~/.bash_profile访问类似文件时报告?或者我应该使用 OSX 上的另一个程序来实现straceLinux 上允许的相同类型的文件打开跟踪?或者在 OSX 上启动的进程是否如此不同,以至于它在开始作为独立进程运行之前以某种方式在后台“加载”进程~/.bash_profilebashbash

相关内容