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

Perl 重定向或管道文件到标准输出,perl,file,redirect,shell,pipe,Perl,File,Redirect,Shell,Pipe,如何重定向一个小(有趣!我尝试了以下方法: $ mkfifo fifo.txt $ curl http://www.google.com -o fifo.txt | wc fifo.txt 几乎是一根管子……一根命名的管子:p 另一方面,如果您对在标准输出上打印感兴趣(无需管道): 有趣!我试过这个: $ mkfifo fifo.txt $ curl http://www.google.com -o fifo.txt | wc fifo.txt 几乎是一根管子……一根命名的管子:p 另一方面

如何重定向一个小(有趣!我尝试了以下方法:

$ mkfifo fifo.txt
$ curl http://www.google.com -o fifo.txt | wc fifo.txt
几乎是一根管子……一根命名的管子:p

另一方面,如果您对在标准输出上打印感兴趣(无需管道):


有趣!我试过这个:

$ mkfifo fifo.txt
$ curl http://www.google.com -o fifo.txt | wc fifo.txt
几乎是一根管子……一根命名的管子:p

另一方面,如果您对在标准输出上打印感兴趣(无需管道):


如果一个程序希望从一个文件中读取它的输入,那么这就是你必须要做的。为了避免接触文件系统,你正在使用的所有程序都必须了解如何从标准输入读取和写入标准输出(或其他非文件系统的设备)

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


tarcf-foo/|gzip-c>foo.tgz

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


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

如果程序希望从文件中读取其输入,那么这就是您不打算做的o必须这样做。为了避免接触文件系统,您正在使用的所有程序都必须了解如何从stdin读取和写入stdout(或其他非文件系统的设备)

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


tarcf-foo/|gzip-c>foo.tgz

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


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

如果程序A要运行程序B,您可以使用该函数在n 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";
}
!/usr/bin/perl
严格使用;
使用警告;
我的$i=0;
while(我的$line=){
打印$i++,“:$line”;
}

如果程序A要运行程序B,您可以使用该函数在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";
}
!/usr/bin/perl
严格使用;
使用警告;
我的$i=0;
while(我的$line=){
打印$i++,“:$line”;
}

一个更具体的例子,说明你想做什么,会使问题更容易回答。另外,你为什么要避免使用文件系统?一个更具体的例子说明你想做什么,会使问题更容易回答。另外,你为什么要避免使用文件系统?看看你是否可以使用更大或更大的文件系统以粗体显示的经验教训“它要求两个程序都能够读/写stdin/stdout”。我将此标记为已接受的答案;)。当然,除非有人发布了如何使用不具备这些功能的程序。请参阅Jay,如果您可以将其放大或以粗体显示,请参阅经验教训“它要求两个程序都能够读/写stdin/stdout”。我将此标记为已接受的答案;)。当然,除非有人发布如何使用不具备这些功能的程序。