用於列出來源/執行檔的包裝腳本

用於列出來源/執行檔的包裝腳本

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

相關內容