osx dtruss não relata a abertura ~ / .bash_profile durante o rastreamento do bash?

2

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("/AppleInternal
echo "*** THIS IS ~/.bash_profile RUNNING ***"
", 0x7FFF5CBC2A88, 0x0) = -1 Err#2 41819/0xce5a2: stat64("/usr/lib/dtrace/libdtrace_dyld.dylib
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
", 0x7FFF5CBC23F8, 0x7FFF5CBC3330) = 0 0 41819/0xce5a2: open("/usr/lib/dtrace/libdtrace_dyld.dylib
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
", 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?

    
por sdaau 24.10.2017 / 17:00

0 respostas

Tags