Setting shell's control break statement in the standard input stream “EOD” to exit the COBOL program
我想通过在shell脚本中通过以下方式在EOD中分配命令行提示符值来调用cobol程序。
1 2 3 4 5 6 | #!/bin/bash run pub/coblprog<<:EOD: 1 2 3 :EOD: |
考虑一下COBOL程序" coblprog"是否具有4个命令行提示符,并在运行时期望4个输入命令行参数。我在EOD中指定了3个提示值。由于COBOL具有四个提示,但在EOD时确实传递了三个值,因此COBOL程序将进入无限循环以期待第四个提示值。
我的要求是,我想在第二个:EOD:之前的所有提示值之后设置shell的控制break语句(如下所示)。通过查看该shell的控制语句,该shell脚本应异常终止。
1 2 3 4 5 6 7 | #!/bin/bash run pub/coblprog<<:EOD: 1 2 3 exit 1 :EOD: |
我在脚本中有exit语句并可以运行,但是没有运气..!请建议我一个好的解决方案。
我正在LINUX中执行脚本,COBOL程序是Micro Focus COBOL。
<<:EOD:之后的行中的数据,直到刚开始的:EOD:之前的行,而不是shell控制语句输入到COBOL程序,因此,出口1将是数据,可能不是您想要什么。
如果要在运行coblprog之后退出shell脚本,请将其放在:EOD:.. pb开头的行之后
1 2 3 4 5 6 7 8 | #!/bin/bash run pub/coblprog<<:EOD: 1 2 3 4 :EOD: exit 1 |
好吧,不回答您的问题,所以...在黑暗中进行射击。
您的程序未循环。
看起来像这样吗?
1 2 3 4 5 | PROCEDURE DIVISION. ACCEPT VAR1. ACCEPT VAR2. ACCEPT VAR3. ACCEPT VAR4. |
我什至已经编码了无意义的点。
您正在脚本中堆叠三个"用户输入"。
第一个ACCEPT接受第一个,第二个接受第二个,第三个接受第三个。
第四个ACCEPT找不到等待它的数据,因此它正在等待...为您服务。输入。它不是循环的,只是在等待输入。您按Ctrl-C,然后将其作为循环关闭。
如果您有四个ACCEPT,则需要四个数据条目。在脚本中提供四个,或"手动"提供第四个,或更改程序,使其仅接受三个。
我对您的COBOL解释器一点都不熟悉,但是如果它的编程方式正确,那么当没有更多输入可用时,它也应该退出。如果是这样,则将其输入三行而不是四行就足够了。但是,看来您已经尝试过了。
作为一种粗略的解决方法,您可以将其连接到FIFO,并在输入最后一行输入后杀死它一段时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/sh fifo=/tmp/cobolfifo.$$ # insecure, should have more randomness mkfifo $fifo cat >>$fifo <<HERE & 1 2 3 HERE run pub/coblprog <$fifo & cobol=$! sleep 5 kill $cobol rm $fifo |
任何人都猜测五秒钟是否足够。如果有任何方法可以更改COBOL程序,这样就不必要了,那可能是最明智的解决方法。