【问题标题】:redirect or pipe file to standard out重定向或管道文件到标准输出
【发布时间】:2010-10-22 07:07:45
【问题描述】:

你如何将一个小(

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

您可以使用任何脚本或 shell,但我更喜欢使用 bash 或 perl。

【问题讨论】:

  • 一个更具体的例子来说明你正在尝试做的事情会让这个问题更容易回答。另外,您为什么要避免使用文件系统?

标签: perl file redirect shell pipe


【解决方案1】:

有趣!我试过这个:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • Seejay 如果您可以放大或加粗,吸取的教训“它要求两个程序都能够读取/写入标准输入/标准输出”。我会将其标记为已接受的答案;)。当然,除非有人发布如何使用不具备这些功能的程序来做到这一点。
    【解决方案3】:

    如果程序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";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      相关资源
      最近更新 更多