如何在BPXBATCH中编写长z/OS UNIX shell命令

FRA*_*JOL 2 unix shell jcl zos

我将尽可能地描述我的问题.

我事先知道可以使用第一行末尾的反斜杠键入不适合一行的z/OS shell UNIX命令.事实上,我已经在我正在使用的计算机上测试过并且执行得很好.

例如; 为了做测试我输入ls命令如下:

首先没有来自命令行的反斜杠:

ls -la
Run Code Online (Sandbox Code Playgroud)

在从命令行使用反斜杠之后:

ls\
 -la
Run Code Online (Sandbox Code Playgroud)

我得到了同样好的结果

我想知道的是如何在使用BPXBATCH执行的STDIN中的z/OS UNIX shell脚本中执行相同操作.

如果我按照以下命令执行ls -la它执行得很好; 但是,如果我尝试将它分成两行,它就不起作用了.

愿任何人在这个问题上有所了解吗?

很多人提前说

(Obvioulsy ls -la是一个非常简单的例子,只是为了表明我面临的问题;真正的命令要大得多)

mik*_*ike 6

我会捅这个.使用BPXBATCH,您希望发出shell命令.这是一个简单的例子:

//TSTRADMB  JOB  MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=0M
//BPXIT EXEC PGM=BPXBATCH,PARM='SH ls -l'
//BPXPRINT DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
Run Code Online (Sandbox Code Playgroud)

这具有将shell命令的输出写入ls -lstdout 所需的效果.但是 - 如果它是一个更长的字符串呢?你可以采取两种方式.一种是编写一个包装器脚本并从BPXBATCH调用它(这就是我要做的).另一种方法是将PARM放在多行中,在这种情况下,您需要遵循JCL规则继续(在第72列中使用+),例如

//TSTRADMB  JOB  MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=0M
//BPXIT EXEC PGM=BPXBATCH,PARM='SH ls -l "/u/tstradm/ThisIsAReallyLongD+
//             irectoryThatCrossesMultipleLines"'
//BPXPRINT DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
Run Code Online (Sandbox Code Playgroud)

与JCL的间距真的很烦人 - 所以你必须把它弄好.该+号必须在第72列,否则会出现JCL错误.下一行文本的开头从第16列开始.迟到并最终得到空白(在这种情况下会产生影响).


小智 6

要将长命令传递给 BPXBATCH,请使用 STDPARM DD。

虽然可以使用 JCL 延续规则通过 JCL EXEC 语句上的 PARM 参数将相对较长的命令传递给 BPXBATCH,但此方法仍被限制为 100 个字节。

通过 STDPARM 传递给 BPXBATCH 的参数文件支持长达 64K 的参数(即命令)。参数文件可以是 z/OS-Unix 文件、传统的 z/OS 数据集或 JCL 中的 in-stream。

例如,放置一个长命令(此示例命令为 105 字节):

SH ls -altr /listed_environments/cics/test/pickup/webs/test-portal-v01/src/assets/mixins | grep functions
Run Code Online (Sandbox Code Playgroud)

进入 z/OS-Unix 文件 /u/userid/stdparmfile

然后使用 STDPARM(PATHOPTS 必须设置为 ORDONLY)通过 BPXBATCH 执行命令:

//USSCMD EXEC PGM=BPXBATCH
//STDERR  DD SYSOUT=*
//STDOUT  DD SYSOUT=*
//STDPARM DD PATH='/u/userid/stdparmfile',PATHOPTS=ORDONLY
/*
//
Run Code Online (Sandbox Code Playgroud)

或者将相同的命令放入传统的 z/OS 数据集(具有足够的 LRECL)。确保通过发出UNNUM和/或NUMBER OFF在 ISPF EDIT 中从数据集中删除序列号。然后同样通过JCL提交:

//USSCMD EXEC PGM=BPXBATCH
//STDERR  DD SYSOUT=*
//STDOUT  DD SYSOUT=*
//STDPARM DD DISP=SHR,DSN=USERID.STDPARM.TEST
/*
//
Run Code Online (Sandbox Code Playgroud)

STDPARM DD 上的流内提交有一点限制,因为在每个行尾都假定一个空格字符。如果流内命令可以在空格字符边界上分解以适应 JCL 的 80 字节限制,那么它应该没问题。我们在这里使用的示例命令的工作方式如下:

//USSCMD EXEC PGM=BPXBATCH
//STDERR  DD SYSOUT=*
//STDOUT  DD SYSOUT=*
//STDPARM DD *
SH ls -altr
/listed_environments/cics/test/pickup/webs/test-portal-v01/src/assets/mixins
| grep functions
/*
//
Run Code Online (Sandbox Code Playgroud)

但是,包含连续文本字符串 > 80 字节的命令可能会给流媒体带来挑战。

可以在此处找到 STDPARM 的 z/OS 2.3 文档:https ://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxa400/batstdparm.htm