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

How to write long z/OS UNIX shell commands in BPXBATCH

我会尽可能详细地描述我的问题。

我事先知道可以在第一行末尾使用反斜杠键入不适合一行的 z/OS shell UNIX 命令。事实上,我已经在我正在使用的计算机上对其进行了测试并且运行良好。

例如;为了进行测试,我输入了如下 ls 命令:

首先在命令行中没有反斜杠:

ls -la

也从命令行使用反斜杠后:

ls\
 -la

我得到了同样好的结果

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

如果我把命令如下 ls -la 它执行得很好;但如果我尝试将它分成两行,它就不起作用。

有人可以解释一下这个问题吗?

提前致谢

(显而易见 ls -la 是一个非常简单的示例,仅用于说明我面临的问题;实际命令要大得多)

在 BPXBATCH 中,您实际上想使用“+”作为 STDIN 的延续字符。 BPXBATCH 是一个 TSO 命令处理器,因此它使用 TSO 连续字符而不是 USS'

我会尝试一下。 使用 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=*

这具有将 shell 命令 ls -l 的输出写入标准输出的预期效果。 但是 - 如果它是一个更长的字符串怎么办?你可以走两种方式。一种是编写包装器脚本并从 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=*

JCL 的间距真的很烦人 - 所以你必须把它弄好。该 + 号必须在第 72 列中,否则您会收到 JCL 错误。下一行文本的开头是第 16 列。开始晚了,你会得到空白(在这种情况下会有所不同)。

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

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

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

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

SH ls -altr /listed_environments/cics/test/pickup/webs/test-portal-v01/src/assets/mixins | grep functions

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

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

//USSCMD EXEC PGM=BPXBATCH
//STDERR  DD SYSOUT=*
//STDOUT  DD SYSOUT=*
//STDPARM DD PATH='/u/userid/stdparmfile',PATHOPTS=ORDONLY
/*
//

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

//USSCMD EXEC PGM=BPXBATCH
//STDERR  DD SYSOUT=*
//STDOUT  DD SYSOUT=*
//STDPARM DD DISP=SHR,DSN=USERID.STDPARM.TEST
/*
//

STDPARM DD 上的流内提交有更多限制,因为每个行尾都假定有一个 space 字符。如果流内命令可以在 space-char 边界上分开以适应 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
/*
//

但是,包含大于 80 字节的不间断文本字符串的命令可能会给插播带来挑战。

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