如何在没有输入源文件但通过管道的情况下 运行 cobc?
How to run cobc without an input source file, but via a pipe?
是否可以在不提供输入文件的情况下执行 COBOL 代码?我正在使用 cobc
.
我试图将代码传送到 cobc
进程:
$ cat my-input.cbl | cobc
cobc: No input files
要编译一个文件并运行它,我这样做:
cobc -x di.cbl -o a && ./a
假设我没有文件,我只有代码在某处(可能在变量中,作为字符串),我可以将它传递给 cobc
吗?这比创建文件然后编译它更好 运行 它。
在我的例子中,用户输入了 COBOL 程序的源代码,这是一个字符串变量。目前,我将代码保存在一个文件中,编译它然后执行它。如果 cobc 支持在 stdin 中或什至作为 cli 选项管道传输代码片段,并生成二进制文件或什至直接显示结果(不确定这是好主意还是坏主意),那就太好了。例如,node 有 -p 选项:node -p 'console.log(1)'——这将输出 1\nundefined。 g++ 具有此功能 –
稍微偷偷摸摸,这是可以做到的。首先创建一个我们可以用来测试的文件:
000100 * HELLO.COB OpenCOBOL FAQ example
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. Hello.
000400 PROCEDURE DIVISION.
000500 DISPLAY "Hello world!".
000600 STOP RUN.
现在您已经知道我们可以编译 运行 这个:
pax> cobc -x hello.cob ; hello
Hello world!
但是,如果您不想要它在文件中,您可以简单地使用 /dev/stdin
"file" 来获取信息,调整输出文件所以它给你你想要的:
pax> cat hello.cob | cobc -x /dev/stdin -o hello2 ; hello2
Hello world!
它来自一个文件,但它不是 cobc
打开文件进行编译,因此您可以将 cat hello.cob
替换为任何生成 COBOL 源文件到其标准输出的命令。
您在程序中需要做的就是打开一个进程 运行ning cobc
,将 /dev/stdin
文件作为输入和合适的输出文件,然后通过管道传输您的 COBOL编程进去。
昨天不可能,但今天是,一旦领导批准更改,我会立即将更改放入源代码树中。
对编译器源代码进行了两处小改动,并且 - 可用于指示标准输入。
prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing -
-: 1: Warning: PROCEDURE DIVISION header missing - assumed
prompt$ ls -l
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing
prompt$ ./thing
hello
这将适用于任何操作系统,而不仅仅是那些支持 /dev/stdin 的操作系统(目前,正如 paxdiablo 所写,对于 GNU/Linux 等是一个非常有效的选项) .
顺便说一句; cobc 已经可以用作 POSIX 解释器。
#!/usr/local/bin/cobc -xvg
identification division.
program-id. SAMPLE.
procedure division.
display "scripted" end-display
goback.
end program SAMPLE.
和
prompt$ chmod +x interp.cob
prompt$ ./interp.cob
给予
Command line: /usr/local/bin/cobc -xvg ./interp.cob
Preprocessing: ./interp.cob -> interp.i
Return status: 0
Parsing: interp.i (./interp.cob)
Return status: 0
Translating: interp.i -> interp.c (./interp.cob)
Executing: gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused
-fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o"
"interp.c"
Return status: 0
Executing: gcc -std=gnu99 -Wl,--export-dynamic -o "interp"
"/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp
-lncursesw -ldb -ldl
Return status: 0
遗憾的是,这只是为了构建。执行需要一个额外的步骤。
prompt$ ./interp
scripted
"run the code now" 没有编译器选项,因此将添加 -J(固定格式)和 -j(自由格式)选项。 运行 作业,成为 -x(创建可执行文件)的新形式,但也会在处理结束时执行二进制文件。然后我们将可以访问 POSIX 中的 cobc "scripts"。目前只允许构建,运行 必须是一个单独的命令。
并且 POSIX hashbang 行的固有限制仅限于单个参数,因此 -j -free 和 -j -Xref 等都不起作用,但在限制范围内,它会允许对于 cobc 脚本。
这是对编译器的又一行更改,以及 400 行选项解析和文档。 ;-)
应该会在几个小时内准备好进行测试。同样,这些更改需要所有其他编译器维护者的批准,但我看不出有任何理由不允许这些改进。两次提交,一次用于 - 作为标准输入,-J -j 用于编译结束时的 运行 作业。
是否可以在不提供输入文件的情况下执行 COBOL 代码?我正在使用 cobc
.
我试图将代码传送到 cobc
进程:
$ cat my-input.cbl | cobc
cobc: No input files
要编译一个文件并运行它,我这样做:
cobc -x di.cbl -o a && ./a
假设我没有文件,我只有代码在某处(可能在变量中,作为字符串),我可以将它传递给 cobc
吗?这比创建文件然后编译它更好 运行 它。
在我的例子中,用户输入了 COBOL 程序的源代码,这是一个字符串变量。目前,我将代码保存在一个文件中,编译它然后执行它。如果 cobc 支持在 stdin 中或什至作为 cli 选项管道传输代码片段,并生成二进制文件或什至直接显示结果(不确定这是好主意还是坏主意),那就太好了。例如,node 有 -p 选项:node -p 'console.log(1)'——这将输出 1\nundefined。 g++ 具有此功能 –
稍微偷偷摸摸,这是可以做到的。首先创建一个我们可以用来测试的文件:
000100 * HELLO.COB OpenCOBOL FAQ example
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. Hello.
000400 PROCEDURE DIVISION.
000500 DISPLAY "Hello world!".
000600 STOP RUN.
现在您已经知道我们可以编译 运行 这个:
pax> cobc -x hello.cob ; hello
Hello world!
但是,如果您不想要它在文件中,您可以简单地使用 /dev/stdin
"file" 来获取信息,调整输出文件所以它给你你想要的:
pax> cat hello.cob | cobc -x /dev/stdin -o hello2 ; hello2
Hello world!
它来自一个文件,但它不是 cobc
打开文件进行编译,因此您可以将 cat hello.cob
替换为任何生成 COBOL 源文件到其标准输出的命令。
您在程序中需要做的就是打开一个进程 运行ning cobc
,将 /dev/stdin
文件作为输入和合适的输出文件,然后通过管道传输您的 COBOL编程进去。
昨天不可能,但今天是,一旦领导批准更改,我会立即将更改放入源代码树中。
对编译器源代码进行了两处小改动,并且 - 可用于指示标准输入。
prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing -
-: 1: Warning: PROCEDURE DIVISION header missing - assumed
prompt$ ls -l
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing
prompt$ ./thing
hello
这将适用于任何操作系统,而不仅仅是那些支持 /dev/stdin 的操作系统(目前,正如 paxdiablo 所写,对于 GNU/Linux 等是一个非常有效的选项) .
顺便说一句; cobc 已经可以用作 POSIX 解释器。
#!/usr/local/bin/cobc -xvg
identification division.
program-id. SAMPLE.
procedure division.
display "scripted" end-display
goback.
end program SAMPLE.
和
prompt$ chmod +x interp.cob
prompt$ ./interp.cob
给予
Command line: /usr/local/bin/cobc -xvg ./interp.cob
Preprocessing: ./interp.cob -> interp.i
Return status: 0
Parsing: interp.i (./interp.cob)
Return status: 0
Translating: interp.i -> interp.c (./interp.cob)
Executing: gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused
-fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o"
"interp.c"
Return status: 0
Executing: gcc -std=gnu99 -Wl,--export-dynamic -o "interp"
"/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp
-lncursesw -ldb -ldl
Return status: 0
遗憾的是,这只是为了构建。执行需要一个额外的步骤。
prompt$ ./interp
scripted
"run the code now" 没有编译器选项,因此将添加 -J(固定格式)和 -j(自由格式)选项。 运行 作业,成为 -x(创建可执行文件)的新形式,但也会在处理结束时执行二进制文件。然后我们将可以访问 POSIX 中的 cobc "scripts"。目前只允许构建,运行 必须是一个单独的命令。
并且 POSIX hashbang 行的固有限制仅限于单个参数,因此 -j -free 和 -j -Xref 等都不起作用,但在限制范围内,它会允许对于 cobc 脚本。
这是对编译器的又一行更改,以及 400 行选项解析和文档。 ;-)
应该会在几个小时内准备好进行测试。同样,这些更改需要所有其他编译器维护者的批准,但我看不出有任何理由不允许这些改进。两次提交,一次用于 - 作为标准输入,-J -j 用于编译结束时的 运行 作业。