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

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程序,这样就不必要了,那可能是最明智的解决方法。