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

Posted

技术标签:

【中文标题】如何在 BPXBATCH 中编写长 z/OS UNIX shell 命令【英文标题】:How to write long z/OS UNIX shell commands in BPXBATCH 【发布时间】:2018-05-15 16:14:14 【问题描述】:

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

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

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

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

ls -la

在命令行后面加上反斜杠:

ls\
 -la

我得到了同样好的结果

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

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

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

提前多谢

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

【问题讨论】:

对不起;示例命令 ls\ -la 跨越两行;第一行直到反斜杠。第二行有一个空格加-la 在您的帖子中,“\”是该行的最后一个字符(OK)。当它不起作用时,你是否在 de 反斜杠后放了一个空格?在这种情况下,bashslash 将在空间上工作,而不是在 '\n' 上。 【参考方案1】:

我会尝试一下。 使用 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 列开始。开始晚了,最后会出现空白(在这种情况下会有所不同)。

【讨论】:

谢谢迈克;您的回答帮助我解决了我的问题。 很高兴听到这个消息! @mike 谢谢!如果我添加第三个续行,则会显示 JCL 错误。我在前2的第72列添加了加号。第三行不能添加? 很遗憾,有 100 个字符的限制!这可能就是你要打的【参考方案2】:

要将长命令传递给 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

/u/userid/stdparmfile的z/OS-Unix文件中

然后通过 BPXBATCH 使用 STDPARM 执行命令(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 和/或 NUMBER OFF 确保从数据集中删除序列号。然后同样通过JCL提交:

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

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
/*
//

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

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

【讨论】:

非常感谢 Rich;这几周我一直很忙,直到今天我还没有能够仔细阅读和检查你的答案。我已经测试了您回复的每个部分,并且一切正常。【参考方案3】:

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

【讨论】:

以上是关于如何在 BPXBATCH 中编写长 z/OS UNIX shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

z/OS 中的 BPXBATCH 实用程序 - 执行 jar 文件

在 z/OS UNIX 文件中替换十六进制字符

如何编写 z/OS 健康检查?

如何在 z/OS 中编写 DB2 命令脚本?

IBM z/os 上的 teradata xml 服务

FTPConnectionClosedException:连接关闭,BPXBATCH 中没有指示