如何在 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 命令的主要内容,如果未能解决你的问题,请参考以下文章