用于列出源/执行文件的包装脚本

用于列出源/执行文件的包装脚本

是否可以编写一个运行的my.sh命令递归地打印此脚本来源或执行的每个路径- 那是,不改变原来的代码根本吗?其想法是验证哪些文件实际用于特定的执行路径,而无需进行耗时且容易出错的手动跟踪。

例如:

$ > 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

答案1

这似乎可以解决问题:

$ strace -fe open ./my.sh 2>&1 >/dev/null | \
grep --only-matching '^\(\[pid\s\+[0-9]*\] \)\?open("[^"]\+' | \
grep --only-matching '".*' | \
cut --characters 2-

换句话说,跟踪执行和打印open调用,交换 stdout 和 stderr,然后格式化结果以去除不相关的文本。

它也打印一些库路径,这并不是一个大问题:

/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

一些剩余的问题:

  • 有没有某种方法可以可靠地区分 shell 路径和库路径?后者似乎是可能的,因为所有库引用都使用O_CLOEXEC选项,而所有 shell 参考都没有这样做。
  • 是否可以区分源路径和执行路径?
  • 是否存在该命令会失败的明显极端情况?

相关内容