如何使用 bash 脚本将一个 C 程序的输出重定向到另一个 C 程序



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

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

我尝试按照 bash 脚本给我错误

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

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

Prog2:: argument list too long.

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

prog2 "`prog1 file.txt`"

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

prog2 "$(prog1 file.txt)"

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

prog1 | prog2

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

管道

!!!!

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

您必须在 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 */
}

相关内容

  • 没有找到相关文章

最新更新