LoginSignup
2
0

(QA) ACSから(IBM iの外から)IBM i のシェルコマンドを実行する

Last updated at Posted at 2024-05-10

イントロ(これまでの経緯)

こちらの記事のコメント欄で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と入力します。
image.png
エンターキーを押すとQSHELLが起動します。
qshのコマンドラインに ls コマンドを入力して、エンターキーを押すと、、
image.png
lsの結果リストが表示されます。
image.png
念のためにpwdで確認すると、ルート/ 配下のリストでした。
image.png

②QP2TERMから

①の画面の場合、F3キーを押して一度QSHELLを終了し、IBM i OSコマンドラインに戻ります。以下のように call qp2termと入力しエンターキーを押します。
image.png
以下のシェル画面が表示されます。画面トップの表記が①と異なります。lsを入力し実行すると、
image.png
結果が表示されます。①と同じディレクトリをls表示していますが、レイアウトがちょっと違っています。
image.png
念のためpwdも同じでした。
image.png

③QP2SHELLから

IBM i OSコマンドラインに下記のように call qp2shell parm('/QOpenSys/bin/ls' '/') と入力してエンターキーを押下
image.png
lsの実行結果が5250画面に返されます。PF3キーで終了します。
image.png

以上が5250からの実行例です。

ACSのSQLスクリプト実行画面からQP2SHELLで ls コマンドを実行する

それではACSから実行してみます。
ACSのSQL画面を出して、、③のコマンドを入力します。ただし冒頭にCL:を付加します

CL: call qp2shell parm('/QOpenSys/bin/ls' '/') ;

image.png
上記画面ではすでに張り付けたコマンドを実行後で、最下行に正常に実行された、とメッセージがあります。そのひとつ上の行にQPRINTに変更・・うんぬんのメッセージも出ていますがlsコマンドの結果はIBM i 上のスプールに出力されています。
image.png
スプールを5で表示すると、、lsコマンドの結果を確認できます。
image.png

・・・ちなみに①qshをACSから実行すると、、
image.png
エラーになりました。IBM i 上のオブジェクトタイプが*CMDなためです。

(QA)もしかして、冒頭の「CL: call」を「CL: 」のみに変更すれば、オブジェクトタイプが*CMDなqshをACSから実行できたりしますか?

試してみました。**CL: QSH ; と入力。えいや。
image.png
guriguriさんの予想通り
CMDオブジェクトのQSHが実行できました。
ただし、QSHは5250画面でシェルを表示するコマンドの為実行結果等はSQL実行画面には返されません。(スプール出力もありませんでした。)

以上です。

p.s guriguriさま
コメントありがとうございます。

2
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0