¿Es posible escribir un comando que se ejecute my.sh
yimprime cada ruta obtenida o ejecutada por este script de forma recursiva- Eso es,sin alterar el código original¿en absoluto? La idea es verificar qué archivos se utilizan realmente para una ruta de ejecución específica, sin un seguimiento manual que requiere mucho tiempo y es propenso a errores.
Por ejemplo:
$ > my.sh cat <<'EOF'
#!/bin/sh
. ./foo.sh
EOF
$ > foo.sh cat <<'EOF'
#!/bin/sh
./bar.sh
EOF
$ > bar.sh cat <<'EOF'
#!/bin/sh
echo bar
EOF
$ chmod u+x my.sh bar.sh
$ magic command
[...]
./my.sh
./foo.sh
./bar.sh
Respuesta1
Esto parece funcionar:
$ strace -fe open ./my.sh 2>&1 >/dev/null | \
grep --only-matching '^\(\[pid\s\+[0-9]*\] \)\?open("[^"]\+' | \
grep --only-matching '".*' | \
cut --characters 2-
En otras palabras, rastree las open
llamadas de ejecución e impresión, intercambie stdout y stderr, luego formatee el resultado para eliminar el texto irrelevante.
También imprime algunas rutas de biblioteca, lo que en realidad no es un gran 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
Algunas preguntas restantes:
- ¿Existe alguna forma de distinguir de manera confiable entre las rutas del shell y de la biblioteca? Esto último parece ser posible ya que todas las referencias de la biblioteca utilizan el
O_CLOEXEC
opción, mientras que ninguna de las referencias de shell lo hace. - ¿Es posible distinguir entre rutas de origen y ejecutadas?
- ¿Existen casos extremos demostrables en los que este comando fallará?