是否可以编写一个运行的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 参考都没有这样做。 - 是否可以区分源路径和执行路径?
- 是否存在该命令会失败的明显极端情况?