是否可以編寫一個運行的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 參考都沒有這樣做。 - 是否可以區分來源路徑和執行路徑?
- 是否存在該命令會失敗的明顯極端情況?