実行される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
残りの質問:
- シェルパスとライブラリパスを確実に区別する方法はありますか?すべてのライブラリ参照は以下を使用するので、後者が可能に見えます。
O_CLOEXEC
オプションですが、すべてのシェル参照はこれを行いません。 - ソースパスと実行パスを区別できますか?
- このコマンドが失敗する明らかな極端なケースはありますか?