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

## イントロ（これまでの経緯）
[こちらの記事](https://qiita.com/gomAnomalocaris/items/5fe85c25195d35e2bc6e)のコメント欄で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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/fa151a9d-4f5d-5faa-ae25-0208dc7c8e61.png)
エンターキーを押すとQSHELLが起動します。
qshのコマンドラインに ls コマンドを入力して、エンターキーを押すと、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5eae9599-f004-a6d8-cfc3-f93b91ccb6c8.png)
lsの結果リストが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f3e78af5-fd43-df86-c126-872fea9a1b5d.png)
念のためにpwdで確認すると、ルート/ 配下のリストでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b7dcaa18-f723-81a3-8a03-56a94e50c053.png)

### ②QP2TERMから
①の画面の場合、F3キーを押して一度QSHELLを終了し、IBM i OSコマンドラインに戻ります。以下のように ***call qp2term***と入力しエンターキーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3b3affa1-d9aa-2a35-9d0a-8264079f3983.png)
以下のシェル画面が表示されます。画面トップの表記が①と異なります。lsを入力し実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/dfad84e0-909c-99ad-6c16-c2069df66bca.png)
結果が表示されます。①と同じディレクトリをls表示していますが、レイアウトがちょっと違っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c8d7e17f-9da5-6754-5f73-512464f65ae4.png)
念のためpwdも同じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5d72bef9-da9d-8a16-53a7-a4d853702737.png)

### ③QP2SHELLから
IBM i OSコマンドラインに下記のように ***call qp2shell parm('/QOpenSys/bin/ls' '/')*** と入力してエンターキーを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/33584dab-7f7a-16eb-6336-000b8846790e.png)
lsの実行結果が5250画面に返されます。PF3キーで終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4f899cb7-47b0-ed05-e12c-2dce11e74261.png)

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

## ACSのSQLスクリプト実行画面からQP2SHELLで ls コマンドを実行する
それではACSから実行してみます。
ACSのSQL画面を出して、、③のコマンドを入力します。ただし***冒頭にCL:を付加します***
```
CL: call qp2shell parm('/QOpenSys/bin/ls' '/') ;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/28d72c0f-771a-2849-8385-d1a3f121df77.png)
上記画面ではすでに張り付けたコマンドを実行後で、最下行に正常に実行された、とメッセージがあります。そのひとつ上の行にQPRINTに変更・・うんぬんのメッセージも出ていますがlsコマンドの結果はIBM i 上のスプールに出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3da93c05-b00e-3695-7a72-c2c24c0b2294.png)
スプールを5で表示すると、、lsコマンドの結果を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d440532e-6af9-13c8-4f64-0d890af94a81.png)

・・・ちなみに①qshをACSから実行すると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3f3fbed7-403e-f1b1-c71c-6e5f9e337c20.png)
エラーになりました。IBM i 上のオブジェクトタイプが*CMDなためです。

## (QA)もしかして、冒頭の「CL: call」を「CL: 」のみに変更すれば、オブジェクトタイプが*CMDなqshをACSから実行できたりしますか？
試してみました。***CL: QSH ; と入力。えいや。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5bf468ef-961c-32db-3989-1b5a19e63a9f.png)
guriguriさんの予想通り*CMDオブジェクトのQSHが実行できました。
ただし、QSHは5250画面でシェルを表示するコマンドの為実行結果等はSQL実行画面には返されません。（スプール出力もありませんでした。）

以上です。

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