Vamos supor que eu tenha essa linha no início do meu ~/.bash_profile :
echo "*** THIS IS ~/.bash_profile RUNNING ***"
Em uma máquina Linux (Ubuntu 14.04), posso inspecionar quais arquivos bash carregam na inicialização com strace , então eu faço isso:
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
O resultado é o esperado:
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 ***
No entanto, eu fiz o login em uma máquina OSX 10.9 via ssh e preciso fazer o mesmo. Como não há strace no OSX, usei dtruss , assim:
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
Estranhamente, parece não haver menção de ~/.bash_profile ser carregado:
$ grep 'bash_' /tmp/log.dtruss $
..., - mesmo que, se eu executar apenas bash --login nessa máquina OSX, eu possa ver o echo acima sendo impresso, o que significa que ~/.bash_profile deve ser carregado?!
É claro que dtruss informa o acesso a outros arquivos:
$ grep 'open\|stat' /tmp/log.dtruss
41819/0xce5a2: stat64("/AppleInternalecho "*** THIS IS ~/.bash_profile RUNNING ***"
", 0x7FFF5CBC2A88, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/usr/lib/dtrace/libdtrace_dyld.dylibstrace -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
", 0x7FFF5CBC23F8, 0x7FFF5CBC3330) = 0 0
41819/0xce5a2: open("/usr/lib/dtrace/libdtrace_dyld.dylibdtruss -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
", 0x0, 0x0) = 3 0
41819/0xce5a2: stat64("/usr/lib/libncurses.5.4.dylib$ grep 'open\|stat' /tmp/log.dtruss
41819/0xce5a2: stat64("/AppleInternal%pre%", 0x7FFF5CBC2A88, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/usr/lib/dtrace/libdtrace_dyld.dylib%pre%", 0x7FFF5CBC23F8, 0x7FFF5CBC3330) = 0 0
41819/0xce5a2: open("/usr/lib/dtrace/libdtrace_dyld.dylib%pre%", 0x0, 0x0) = 3 0
41819/0xce5a2: stat64("/usr/lib/libncurses.5.4.dylib%pre%", 0x7FFF5CBC2208, 0x7FFF5CBC30A0) = 0 0
...
41819/0xce5a2: open("/dev/tty%pre%", 0x6, 0x7FFF79D33940) = 3 0
41819/0xce5a2: open_nocancel("/usr/share/locale/en_US.UTF-8/LC_COLLATE%pre%", 0x0, 0x1B6) = 3 0
...
41819/0xce5a2: stat64("~/.fastlane/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/usr/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = 0 0
41819/0xce5a2: stat64("/bin/bash%pre%", 0x7FFF5CBC3820, 0x0) = 0 0
...
", 0x7FFF5CBC2208, 0x7FFF5CBC30A0) = 0 0
...
41819/0xce5a2: open("/dev/tty%pre%", 0x6, 0x7FFF79D33940) = 3 0
41819/0xce5a2: open_nocancel("/usr/share/locale/en_US.UTF-8/LC_COLLATE%pre%", 0x0, 0x1B6) = 3 0
...
41819/0xce5a2: stat64("~/.fastlane/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/usr/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = -1 Err#2
41819/0xce5a2: stat64("/bin/bash%pre%", 0x7FFF5CBC37E0, 0x0) = 0 0
41819/0xce5a2: stat64("/bin/bash%pre%", 0x7FFF5CBC3820, 0x0) = 0 0
...
..., por exemplo, podemos ver que o diretório $HOME é acessado como parte da pesquisa por $PATH (e, na verdade, que PATH="~/.fastlane/bin:$PATH" é definido nesse mesmo ~/.bash_profile ).
Minha pergunta é: como isso acontece? Existe uma invocação especial de dtruss que eu preciso usar, por isso é reportado quando arquivos como ~/.bash_profile são acessados? Ou há outro programa no OSX que eu deveria usar para obter o mesmo tipo de rastreio aberto de arquivos, que strace permite no Linux? Ou o processo iniciando no OSX é tão diferente que "carrega" ~/.bash_profile para um processo bash de alguma forma em segundo plano, antes que bash comece a ser executado como um processo independente?