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

时间:2018-05-15 16:14:14

标签: shell unix zos jcl

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

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

例如;为了进行测试,我按照以下方式输入ls命令:

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

ls -la

也可以从命令行使用反斜杠:

ls\
 -la

我得到了同样好的结果

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

如果我按照以下命令执行ls -la它执行得很好;但如果我尝试用两行来打破它就行不通。

愿任何人明白这个问题吗?。

提前很多人

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

3 个答案:

答案 0 :(得分: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=*

这具有将shell命令ls -l的输出写入stdout所需的效果。 但是 - 如果它是一个更长的字符串怎么办?你可以采取两种方式。一种是编写一个包装器脚本并从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列开始。迟到并最终得到空白(在这种情况下会产生影响)。

答案 1 :(得分:4)

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

然后使用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和/或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

答案 2 :(得分:1)

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