假设我的开头有这一行~/.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 上的另一个程序来实现strace
Linux 上允许的相同类型的文件打开跟踪?或者在 OSX 上启动的进程是否如此不同,以至于它在开始作为独立进程运行之前以某种方式在后台“加载”进程~/.bash_profile
?bash
bash