■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
オープンソースではソース分析によく使うgrepとUNIXコマンドのパイプ連結を、
RPG3のソース分析に使い見通しをよくします
■特定の文字列を含むファイルを特定する(grep)
RPGソースをIFSにコピーする方法は後述
IFS上にRPGソースがある状態で、例えばGMBKAFというテーブル(ファイル)を修正する
必要が出た場合に、影響するプログラムの一覧を求めたい
FGMBKAF とファイル指定しているRPGをgrepコマンドで抜き出す
$ grep FGMBKAF *|more
CKB103.rpg: FGMBKAF IF E K DISK
CKB103R.rpg: FGMBKAF IF E K DISK
…
IBMiでは多くの場合ファイルとフィールドはシステムで一意になっているので
grepは有効!
次のUNIXコマンドとパイプの考え方を学んだらいろいろな分析ができるようになる
■RPGソースをIFSにコピーする
◯CPYTOSTMFはソース毎に指定!
IBMiネイティブファイルにあるRPG3/RPGLEソースをIFSにCPYTOSTMFで
ソースメンバー名を1つづつ指定してコピーする!
多分数千あるであろうソースメンバー名から転送スクリプトを生成する方法を考えた
UNIXコマンドとパイプの使い方サンプルになっている
以下のbashスクリプトを作成する
ls_{ライブラリ名}_QRPGSRC.bash
#!/bin/bash
system "DSPFD FILE({ライブラリ名}/QRPGSRC) TYPE(*MBRLIST)"
実行すると下記になる
5770SS1 V7R4M0 190621 ファイル記述の表示 24/09/xx 8:42:17 s゚ーニ゙ 1
ファイル. . . . . . . . . : QRPGSRC
ライブラリー. . . . . . : {ライブラリ名}
情報のタイプ. . . . . . . : *MBRLIST
ファイル属性. . . . . . . : *ALL
システム. . . . . . . . . : *LCL
…
メンバー ナbヌ゙ jbポ 日付 日付 時刻 ロテーn゙数 ロテーn゙数
#CDZZAN 16384 RPG 09/04/07 24/07/31 10:15:29 72 0
mgヌn: 指定年月日前日残高セット
#CMMI 8192 RPG 09/04/07 24/07/31 10:15:29 35 0
mgヌn: 指定月セット (ナボモーk] aメ) SBMMI
#CMTZAN 16384 RPG 09/04/07 24/07/31 10:15:29 69 0
…
ここからソースメンバー名だけを抜き出す
grepでRPGとある行を抜き出し、grep -vでQRPGSRCとある行を除外するよう
ls_{ライブラリ名}_QRPGSRC.bashを修正する
| のパイプで処理を連結する
#!/bin/bash
system "DSPFD FILE({ライブラリ名}/QRPGSRC) TYPE(*MBRLIST)"|grep RPG|grep -v QRPGSRC
#CDZZAN 16384 RPG 09/04/07 24/07/31 10:15:29 72 0
#CMMI 8192 RPG 09/04/07 24/07/31 10:15:29 35 0
…
awkでファイル名だけを抜き出し、cpytostmf命令に整形する
#!/bin/bash
system "DSPFD FILE(PMLIB/QRPGSRC) TYPE(*MBRLIST)"|grep RPG|grep -v QRPGSRC \
|awk '{print "system \"CPYTOSTMF FROMMBR(\047\${from}"$1".MBR\047) TOSTMF(\047\${to}"$1".rpg\047) \$opt\""}'
system "CPYTOSTMF FROMMBR('${from}#CDZZAN.MBR') TOSTMF('${to}#CDZZAN.rpg') $opt"
system "CPYTOSTMF FROMMBR('${from}#CMMI.MBR') TOSTMF('${to}#CMMI.rpg') $opt"
…
リダイレクト(>)でファイルに書出し、先頭に変数などを設定する
$ ./ls_{ライブラリ名}_QRPGSRC.bash > cp2IFS_{ライブラリ名}_QRPGSRC.bash
cp2IFS_{ライブラリ名}_QRPGSRC.bash
#!/bin/bash
opt="STMFOPT(*REPLACE) STMFCCSID(1208)"
from='/QSYS.LIB/PMLIB.LIB/QRPGSRC.FILE/'
to='./'
### ここまでの行を追加する
system "CPYTOSTMF FROMMBR('${from}#CDZZAN.MBR') TOSTMF('${to}#CDZZAN.rpg') $opt"
system "CPYTOSTMF FROMMBR('${from}#CMMI.MBR') TOSTMF('${to}#CMMI.rpg') $opt"
…
cp2IFS_{ライブラリ名}_QRPGSRC.bashを実行しIFSにRPGソースをコピーする
$ ./cp2IFS_{ライブラリ名}_QRPGSRC.bash
以下のようにIFSに*.rpgソースができる
total 93272
-rwx------ 1 {ユーザ} 0 3356 Jul 31 11:16 #CDZZAN.rpg
-rwx------ 1 {ユーザ} 0 1860 Jul 31 11:16 #CMMI.rpg
…