如何在 OS X 中显示加载的 shell 文件?

How show loaded shell files in OS X?

就像下面的命令在 Linux 上一样有效,有办法在 shell 中显示加载的文件吗?

echo exit | strace bash -li |& less | grep '^open'

输出为:

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/dev/tty", O_RDWR|O_NONBLOCK)     = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
...

在 macOS 上,您可以使用这组略有不同的命令:

sudo bash -c "echo exit | dtruss bash -li 2>&1 | less | grep '^open'"

或者,如果您有 bash 版本 4 或 5:

sudo bash -c "echo exit | dtruss bash -li |& less | grep '^open'" 

(如评论部分所述there

注:

|&2>&1 | 的 shorthand,在 macOS 附带的 bash 3.x 上不可用(它需要 bash >= 4).它的目的是将标准输出和标准错误都重定向到管道之后的下一个命令的输入。

macOS dtruss 的杠杆作用与 linux 上的 strace 相同:

$ sudo dtruss -t open -n bash

虽然输出可能与您的问题最相似,但输出存在一些差异。

 PID/THRD         SYSCALL(args)                                      = return
 9658/0x130527a:  open("/dev/tty[=11=]", 0x6, 0xFFFFFFFF8ED3D6B8)        = 3 0
 9658/0x130527a:  open("script.sh[=11=]", 0x0, 0x0)                      = 3 0
 ...

"open" 的其他 SYSCALL 个参数包括 open_nocancelopen_extended

dtruss -h will give you a complete set of options.

Dtrace Tools : Brendan Gregg