在标准输入流“EOD”中设置shell的控制break语句以退出COBOL程序

时间:2014-02-20 09:31:32

标签: bash shell cobol

我想通过在“EOD”中分配命令行提示值来通过shell脚本调用cobol程序,如下所示。

#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
:EOD:

考虑COBOL程序“coblprog”是否有4个命令行提示,并且在运行时需要4个输入命令行参数。我在EOD中指定了3个提示值。由于COBOL有四个提示,但在EOD传递3个值时,COBOL程序进入无限循环以期望第四个提示值。

我的要求是,我想在第二个之前的所有提示值之后设置一个shell的控制中断语句(如下所示):EOD:。通过查看shell的控制语句,shell脚本应该异常终止。

#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
exit 1
:EOD:

我在脚本中有退出语句并运行,但没有运气..!请建议我很好的解决方案。

我正在LINUX中执行脚本,COBOL程序是Micro Focus COBOL。

3 个答案:

答案 0 :(得分:1)

&lt;&lt;:EOD之后的行中的数据:直到一开始之前的行:EOD:输入到COBOL程序,而不是 shell控制语句,因此< strong>退出1 将是数据,这可能不是您想要的。

如果你想在运行coblprog后退出shell脚本,那么把它放在行开头之后:EOD:。

#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
4
:EOD:
exit 1

答案 1 :(得分:0)

我对你的COBOL解释器一点都不熟悉,但如果它完全正确编程,它也应该在没有更多输入时退出。如果是这样的话,那么输入三行输入而不是四行就足够了。但是,您似乎已经尝试过了。

作为一种粗略的解决方法,您可以将它连接到FIFO并在输入最后一行输入后将其终止一段时间。

#!/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程序以便不需要这样做,那么这可能是最安全的解决方案。

答案 2 :(得分:0)

好的,不回答你提出的问题,所以......在黑暗中拍摄。

你的程序没有循环。

看起来像这样,不是吗?

PROCEDURE DIVISION.
    ACCEPT VAR1.
    ACCEPT VAR2.
    ACCEPT VAR3.
    ACCEPT VAR4.

我甚至编写了无意义的点。

您在脚本中堆叠了三个“用户输入”。

第一个ACCEPT取第一个,第二个取第二个,第三个接受第三个。

第四个ACCEPT没有找到等待它的数据,所以等待......等你。输入。它不是循环,它只是在等待输入。您按Ctrl-C,并将其作为循环解除。

如果您有四个ACCEPT,则需要四个数据条目。在脚本中提供四个,或者“手动”提供第四个,或者更改程序以使其仅接受三个。