Isso parece fazer o truque:
$ strace -fe open ./my.sh 2>&1 >/dev/null | \
grep --only-matching '^\(\[pid\s\+[0-9]*\] \)\?open("[^"]\+' | \
grep --only-matching '".*' | \
cut --characters 2-
Em outras palavras, rastreie a execução e imprima open
chamadas, troque stdout e stderr, depois formate o resultado para remover texto irrelevante.
Ele também imprime alguns caminhos de biblioteca, o que não é realmente um grande problema:
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./my.sh
./foo.sh
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
./bar.sh
Algumas perguntas restantes:
- Existe alguma maneira de diferenciar de maneira confiável os caminhos do shell e da biblioteca? O último parece ser possível, pois todas as referências da biblioteca usam a opção
O_CLOEXEC
, enquanto nenhuma das referências de shell faz. - É possível distinguir entre caminhos originados e executados?
- Existem exemplos de casos demonstráveis em que esse comando falhará?