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?