1

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

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

我尝试了以下 bash 脚本,这给了我错误

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

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

Prog2:: argument list too long.
4

3 回答 3

3

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

prog2 "`prog1 file.txt`"

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

prog2 "$(prog1 file.txt)"

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

prog1 | prog2

注意:当你想使用管道时,你需要修改 prog2 的代码,因为它需要从 STDIN 而不是命令参数(函数argv的)读取。main()请参阅如何从 C 中的控制台读取一行?有关如何执行此操作的示例。

于 2012-12-03T09:33:52.860 回答
2

管道!!!!

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

于 2012-12-03T09:32:29.857 回答
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 */
}
于 2012-12-03T09:31:30.957 回答