7

私は、数ダース (おそらく 100 以上、数えていません) の bash スクリプトで構成されるプロジェクトを受け取りました。ほとんどのスクリプトは、別のスクリプトを少なくとも 1 回呼び出します。ノードが関数ではなくスクリプトであるコールグラフに相当するものを取得したいと思います。

これを行うための既存のソフトウェアはありますか?

そうでない場合、これを行う方法について賢いアイデアを持っている人はいますか?

私が思いついた最善の計画は、スクリプトを列挙し、ベース名が一意であるかどうかを確認することでした (それらは複数のディレクトリにまたがっています)。スクリプトのパスは通常変数名で保持されているため、ベース名が重複している場合は泣く必要があるため、明確にすることができない場合があります。それらが一意である場合は、スクリプト内の名前を grep し、それらの結果を使用してグラフを作成します。グラフを視覚化するには、いくつかのツール (提案?) を使用します。

提案?

4

3 に答える 3

3

シェル自体を実装でラップし、ラッパーを呼び出したユーザーをログに記録して、元のシェルを実行します。

はい、実際に使用されているスクリプトを特定するには、スクリプトを開始する必要があります。それ以外の場合は、変数拡張全体、PATHなどをサポートするために、シェルエンジン自体と同じ知識を持つツールが必要です。このようなツールについては聞いたことがありません。

呼び出しグラフを視覚化するには、GraphVizのドット形式を使用します。

于 2011-02-24T20:16:00.263 に答える
0

各シェルスクリプトの先頭の#!の後に行を挿入します。タイムスタンプ、スクリプトのフルパス名、および引数リストをログに記録する行。

時間の経過とともに、このログをマイニングして、可能性のある候補を特定できます。つまり、非常に接近してログに記録された2つの行は、最初のスクリプトが2番目のスクリプトを呼び出す可能性が高くなります。

これにより、実際に使用されているスクリプトに集中することもできます。

edスクリプトを使用できます

1a
log blah blah blah
.
wq

そしてそれをそのように実行します:

find / -perm +x -exec ed {} <edscript

exec句の代わりに-printを使用してfindコマンドをテストしてください。そして/はおそらくあなたが使いたいパスではありません。binディレクトリを含める必要がある場合は、含めるパス名を識別するためにgrepに切り替える必要があります。正しい名前でいっぱいのファイルがある場合は、findの代わりにxargsを使用してスクリプトを実行します。

于 2011-02-25T04:37:32.247 に答える