イントロ(これまでの経緯)
こちらの記事のコメント欄でguriguriさんからの質問がありまして、、
Q1. ちなみに、 Qshell (QSH/STRQSH) と PASE shell (QP2TERM/QP2SHELL) は、どのように使い分けるのが良いでしょうか?
■ PASEシェルAPIの違い
https://qiita.com/ushiday/items/08342835a172e242a33f
A1.
guriguriさん、一般的な使い方としては下記な感じだと思います。
①QSH : 5250画面にQSHELL画面を呼び出して対話型でコマンドを実行する。lsコマンドなどを直接5250から打つ場合など。lsの結果はqsh画面上に返されます。
②QP2TERM:5250画面の任意の(①のQSHでなく)IBM i OSコマンドラインから call qp2shell parm('/QOpenSys/bin/ls' '/') というような感じでlsコマンドなどを実行する場合。lsの結果はIBM i OSの(QSHでない)コマンド行画面に返されます。
①のQSHはIBM i OSのQSYS/QSHコマンド(*CMDオブジェクト)として定義(存在)します。②のQP2TERMはQSYS/QP2TERMプログラム(*PGMオブジェクト)、という違いもあります。(今調べました・・^^)。②のプログラムオブジェクトはIBM i の外からもコール(実行)可能で、たとえばACSその他のSQLインターフェースから call qp2shell parm('/QOpenSys/bin/ls' '/') のような形で実行できます(ACSから実行する場合は正しくは、CL: call qp2shell parm('/QOpenSys/bin/ls' '/') ; と冒頭にCLコマンドまたはIBM iのプログラムを実行するよ、という宣言を付けて実行します。これまたちなみにですが、lsコマンドは標準入出力に結果を返すので(5250だったら画面に返す)、ACS SQL画面から実行すると結果はIBM i のスプールファイルとして出力されます)
上記を自分で書く中でテストしてみた画面を以下に掲載します。
5250にサインオンして、QSH, QP2TERM, QP2SHELL で ls コマンドを実行する
①QSHから
以下のように5250のIBM i OSコマンドラインから QSHと入力します。
エンターキーを押すとQSHELLが起動します。
qshのコマンドラインに ls コマンドを入力して、エンターキーを押すと、、
lsの結果リストが表示されます。
念のためにpwdで確認すると、ルート/ 配下のリストでした。
②QP2TERMから
①の画面の場合、F3キーを押して一度QSHELLを終了し、IBM i OSコマンドラインに戻ります。以下のように call qp2termと入力しエンターキーを押します。
以下のシェル画面が表示されます。画面トップの表記が①と異なります。lsを入力し実行すると、
結果が表示されます。①と同じディレクトリをls表示していますが、レイアウトがちょっと違っています。
念のためpwdも同じでした。
③QP2SHELLから
IBM i OSコマンドラインに下記のように call qp2shell parm('/QOpenSys/bin/ls' '/') と入力してエンターキーを押下
lsの実行結果が5250画面に返されます。PF3キーで終了します。
以上が5250からの実行例です。
ACSのSQLスクリプト実行画面からQP2SHELLで ls コマンドを実行する
それではACSから実行してみます。
ACSのSQL画面を出して、、③のコマンドを入力します。ただし冒頭にCL:を付加します
CL: call qp2shell parm('/QOpenSys/bin/ls' '/') ;
上記画面ではすでに張り付けたコマンドを実行後で、最下行に正常に実行された、とメッセージがあります。そのひとつ上の行にQPRINTに変更・・うんぬんのメッセージも出ていますがlsコマンドの結果はIBM i 上のスプールに出力されています。
スプールを5で表示すると、、lsコマンドの結果を確認できます。
・・・ちなみに①qshをACSから実行すると、、
エラーになりました。IBM i 上のオブジェクトタイプが*CMDなためです。
(QA)もしかして、冒頭の「CL: call」を「CL: 」のみに変更すれば、オブジェクトタイプが*CMDなqshをACSから実行できたりしますか?
試してみました。**CL: QSH ; と入力。えいや。
guriguriさんの予想通りCMDオブジェクトのQSHが実行できました。
ただし、QSHは5250画面でシェルを表示するコマンドの為実行結果等はSQL実行画面には返されません。(スプール出力もありませんでした。)
以上です。
p.s guriguriさま
コメントありがとうございます。