如何使用bash脚本将一个C程序的put重定向到其他C程序?

时间:2012-12-03 09:29:00

标签: c bash

我有两个用Prog1.c编写的程序(Prog2.cC),每个程序都有一个命令行参数。

Prog1.c将文件名作为参数,从文件中读取内容并将其输出到STDOUT(标准输出)屏幕。 Prog2.c将数据作为参数并执行某些操作。我想将Prog1.c的输出重定向到Prog2.c作为输入。

我试过跟随bash脚本,它给了我错误

#!/bin/bash
prog2 "`prog1 file.txt`"  

我也尝试过没有引号,在这两种情况下,它都会给我以下错误。

Prog2:: argument list too long.

3 个答案:

答案 0 :(得分:3)

要将命令的输出作为另一个命令的参数,您可以使用反引号:

prog2 "`prog1 file.txt`"

或使用$()(我相信这是bash的首选方式):

prog2 "$(prog1 file.txt)"

如果要将prog1的STDOUT用作prog2的STDIN,请使用| (管道)运营商:

prog1 | prog2

注意:如果要使用管道,则需要修改prog2的代码,因为它需要从STDIN而不是argv函数的main()读取命令参数。有关如何执行此操作的示例,请参阅How to read a line from the console in C?

答案 1 :(得分:2)

PIPES !!!!!

在命令行上(或在脚本中)执行prog1 file.txt | prog2

答案 2 :(得分:1)

你必须在prog1

之前和之后的两个地方使用反引号
prog2 "`prog1 file.txt`"

当你得到"参数列表太长"时,你已达到命令行的系统限制。然后,您必须找到另一种方法将数据发送到prog2。您可以从stdin读取,并将prog1的输出传递给prog2

prog1 file.txt | prog2

当您将数据从prog1传送到prog2时,您必须更改prog2并从stdin读取而不是使用argv。

逐行阅读示例:

char buf[1024];
while (fgets(buf, 1024, stdin)) {
    /* process line in buf */
}

读取空格分隔词的示例

char buf[1024];
while (scanf("%s", buf) != EOF) {
    /* process word in buf */
}