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

bkkx9g8r  于 2023-06-05  发布在  Unix
关注(0)|答案(4)|浏览(409)

我会尽可能地描述我的问题。
我事先知道,可以在第一行末尾使用反斜杠键入一个z/OSshell UNIX命令,而该命令不适合一行。事实上,我已经在我使用的计算机上测试过了,运行良好。
例如;为了做一个测试,我输入ls命令如下:
首先,在命令行中不使用反斜杠:

ls -la

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

ls\
 -la

我得到同样好的结果
我想知道的是如何在使用BPXBATCH执行的STDIN中的z/OSUNIXshell脚本中执行相同的操作。
如果我把命令如下ls-la它执行良好;但是如果我试着把它分成两行,它就不起作用了。
有没有人能在这个问题上有所启发?.
许多thaks提前
(显然ls -la是一个非常简单的例子,只是为了展示我所面临的问题;真实的命令要大得多)

jjjwad0x

jjjwad0x1#

我来试试。使用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。但是-如果它是一个更长的字符串?有两条路可以走。一种方法是编写一个 Package 器脚本,并从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列开始。开始得晚,你最终会得到空白(在这种情况下会有所不同)。

wribegjk

wribegjk2#

要将长命令传递给BPXBATCH,请使用STDPARM DD。
虽然可以使用JCL连续规则通过JCL EXEC语句上的PARM参数将 * 相对 * 长的命令传递给BPXBATCH,但此方法仍限于100字节。
通过STDPARM传递到BPXBATCH的参数文件支持长度最大为64 K的参数(即命令)。参数文件可以是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

tquggr8v

tquggr8v3#

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

mefy6pfw

mefy6pfw4#

有点晚了,但PBXBATCH只是将多行连接成一行。在您的情况下,它可能看起来像:

//PBXTST   JOB ,MSGLEVEL=(2,0),NOTIFY=&SYSUID.
//DOIT     EXEC PGM=BPXBATCH
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//STDPARM  DD *
SH 
ls
-a
/*

就像一个有多个命令的例子一样,通常这是多个命令(注意分号):

//PBXTST   JOB ,MSGLEVEL=(2,0),NOTIFY=&SYSUID.
//DOIT     EXEC PGM=BPXBATCH
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//STDPARM  DD *
SH (
cd somedir;
ls -a
)
/*

请参阅此链接以供参考:https://bit.listserv.ibm-main.narkive.com/LphTazF4/multi-line-stdparm-shell-script-for-bpxbatch

相关问题