перенаправить или передать файл на стандартный выход - PullRequest
0 голосов
/ 22 октября 2010

Как перенаправить небольшой (<20 КБ) файл для передачи в другую программу, чтобы он никогда не записывался на диск. </p>

В качестве примера вы можете использовать cfront и gcc.Любой пример подойдет, если вы перенаправляете что-то, что обычно выводит файл, на то, что обычно принимает файл.

Вы можете использовать любой скрипт или оболочку, но я бы предпочел видеть bash или perl.

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

интересно!Я попробовал это:

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

почти труба ... именованная труба: p

С другой стороны, если все, что вас интересует, напечатайте его на стандартный вывод (без необходимости передавать по трубе):

$ curl http://www.google.com -o `tty`
1 голос
/ 22 октября 2010

Если программа ожидает чтения своих входных данных из файла, то это почти то, что вам нужно сделать.Чтобы не касаться файловой системы, все программы, которые вы используете, должны понимать, как читать из stdin и записывать в stdout (или другое устройство, которое не является файловой системой).

МногиеПрограммы в юниверсе Unix могут читать и записывать в std {in, out} так же легко, как и в файл.Хороший пример - это GNU Tar и GZIP.Tar может записывать в stdout и направлять вывод непосредственно в gzip:

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

, но для этого требуется, чтобы и tar, и gzip могли читать / писать в stdin / stdoutа также обычные файлы.

Способ достижения этой цели в вашей собственной программе зависит от используемого языка, но в большинстве случаев обработка stdout & stderr практически такая же, как и для любого другого файла.Аргументы вашей командной строки должны позволять пользователю выбирать это в качестве опции.

0 голосов
/ 22 октября 2010

Если программа 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";
}
...