我有两个用C
编写的程序(Prog1.c
和Prog2.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 */
}