ディレクトリにプログラムP11があり、このプログラムが2つの異なるプログラムP21とP22を呼び出すとします。 P21とP22はそれぞれ2〜2つの異なるプログラムを呼び出します。
つまり
Level-1: |--------------P11-------------|
Level-2: |--------P21----------| |----------P22----------|...
Level-3: P31 P32 P33 P34...
. . . .
. . . .
水形図と同様に、100個のレベルがあり、各レベルには100個のノードがあるため、合計1000個のノードがあります。
このようなツリー構造を提供するには、シェルスクリプトが必要です。
たとえば、シェルスクリプトプログラムは -' MYPGM.sh
' です。
実行時にパラメータが必要です。ここにプログラム名(例:P11)を指定できます。そしてスクリプトはそのようなツリー図を提供します。
出力構造は、上記の図のような形式である必要はありません。索引や提案するすべてを使用できます。たとえば、出力ファイルは次のようになります。
1. P11
1.1 P21 - 1.2 P22
1.1.1 P31 - 1.1.2 P32 – 1.2.1 P33 – 1.2.2 P34
つまり、各プログラムのインデックス=親プログラムのインデックス+「。」 + 対応する親プログラムのシリアル番号です。
実際には、レベル数と各レベルのノード数は不明ですが、非常に大きいということです。
他のプログラムを呼び出すためのプログラム構文は次のとおりです。
「CHILD_PGM_NAME」に電話をかける
特定のプログラムでサブルーチンを見つけるためのコマンドは次のとおりです。
egrep '^CALL| CALL ' $pgm_name > call_output | cut -d'"' -f2 call_output > call_output_cut | cat call_output_cut
詰まった。上記の出力ファイルを取得するためにこのコマンドを繰り返す方法です。
誰でも提案できますか?
ベストアンサー1
この問題は、awk、python、perlなどを提案します。以下の開始点は、まだアクセスされていない場合に「プログラム」をキューに追加するPerlスクリプトです。出力はグラフィック可視化形式です(@derobertが提案したように)。
#!/usr/bin/perl
print "digraph{\n rankdir=LR \n";
my %visited = ();
while(<>){ # for all lines in all files in @ARGV
$visited{$ARGV}=1; # $ARGV = current file
if(/\bCALL\s*"(.+?)"/) {
print "$ARGV -> $1;\n" ;
push @ARGV,$1 unless $visited{$1};
$visited{$1}=1;
}
}
print "}\n";
使用法:
perl calltree p1 > x.dot
dot -Tpdf -o x.pdf x.dot
または(@derobertに感謝)
dot -Tx11 x.dot
今グラフを確認してください。
@muruが指摘したように、これは通常木ではありません。