将文件重定向或管道文件标准输出

时间:2010-10-22 07:07:45

标签: perl file redirect shell pipe

如何将一个小的(< 20k)文件重定向到另一个程序,以便它永远不会被写入光盘。

您可以使用cfront和gcc作为示例。只要您将通常输出文件的内容重定向到通常接受文件的内容,任何示例都会执行。

您可以使用任何脚本或shell,但我更愿意看到bash或perl。

3 个答案:

答案 0 :(得分:3)

有趣!我试过这个:

$ mkfifo fifo.txt
$ curl http://www.google.com -o fifo.txt | wc fifo.txt

几乎是一个管道......一个命名管道:p

另一方面,如果您有兴趣在stdout上打印它(无需管道):

$ curl http://www.google.com -o `tty`

答案 1 :(得分:1)

如果一个程序希望从文件中读取它的输入,那么这就是你将要做的事情。为避免触及文件系统,您正在使用的所有程序必须了解如何从stdin读取并写入stdout (或其他非文件系统的设备)。

unix Universe中的许多程序都能够像读取文件一样轻松地读取和写入std {in,out}。一个很好的例子是gnu tar和gzip。 tar可以写入stdout并将输出直接传递给gzip:

tar cf - foo/ | gzip -c > foo.tgz

但是这需要tar和gzip能够读/写stdin / stdout以及常规文件。

如何在自己的程序中实现这一点取决于所涉及的语言,但在大多数情况下处理stdout& stderr与任何其他文件几乎相同。您的命令行参数应允许用户选择此选项。

答案 2 :(得分:0)

如果程序A要运行程序B,您可以使用open函数在A和B的STDIN之间创建一个匿名管道:

程序A.pl:

#!/usr/bin/perl

use strict;
use warnings;

my $pid = open my $pipe, "|-", "./B.pl"
    or die "could not run B.pl: $!";

for my $i ("a" .. "g") {
    print $pipe "$i\n";
}
close $pipe;

waitpid $pid, 0;

计划B:

#!/usr/bin/perl

use strict;
use warnings;

my $i = 0;
while (my $line = <>) {
    print $i++, ": $line";
}