我想通过在"EOD"中分配命令行提示符值来通过 shell 脚本调用 cobol 程序,如下所示。
#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
:EOD:
考虑 COBOL 程序"coblprog"是否有 4 个命令行提示符,并且在运行时需要 4 个输入命令行参数。我在EOD中指定了3个提示值。由于COBOL有四个提示,但在EOD时传递了3个值,COBOL程序进入无穷循环以期望第四个提示值。
我的要求是,我想在第二个 :EOD: 之前的所有提示值之后设置 shell 的控制中断语句(如下所示)。通过查看 shell 的控制语句,shell 脚本应该异常终止。
#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
exit 1
:EOD:
我在脚本中有退出语句并运行,但没有运气..!请给我建议好的解决方案。
我正在用LINUX执行脚本,COBOL程序是Micro Focus COBOL。
从 <<:EOD: 之后的行到开头的行中的数据 :EOD: 是 COBOL 程序的输入,而不是 shell 控制语句,因此出口 1 将是数据,这可能不是您想要的。
如果您希望 shell 脚本在运行 coblprog 后退出,请将其放在以 :EOD: 开头的行之后。
#!/bin/bash
run pub/coblprog<<:EOD:
1
2
3
4
:EOD:
exit 1
我完全不熟悉您的 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 程序,使其没有必要,那可能是最明智的解决方案。
好吧,不回答你的问题,所以...在黑暗中拍摄的时间。
您的程序未循环。
看起来像这样,不是吗?
PROCEDURE DIVISION.
ACCEPT VAR1.
ACCEPT VAR2.
ACCEPT VAR3.
ACCEPT VAR4.
我什至编写了毫无意义的点。
您在脚本中堆叠了三个"用户输入"。
第一个接受接受第一个,第二个接受第二个,第三个接受第三个。
第四个 ACCEPT 找不到等待它的数据,所以它等待...给你的。要键入。它不是循环的,它只是在等待输入。您按 Ctrl-C,并将其视为循环。
如果您有四个 ACCEPT,则需要四个数据条目。要么在脚本中提供四个,要么"手动"提供第四个,或者更改程序,使其只接受三个。