2013-12-05 5 views
0

У меня есть скрипт на языке Perl (myscript.pl)STDIN от Баш на PERL скрипт

use strict; 
use IO::Handle; 

open OUTPUT, '>', "output.txt" or die $!; 

STDOUT->fdopen(\*OUTPUT, 'w') or die $!; 

while (<STDIN>){ 
print $_; 
} 

я могу вставить в output.txt, что я пишу на командной строке

также

У меня есть Баш скрипт:.

cat >in.$$ 

cat in.$$> /tmp/msg 

я могу вставить то, что я имею в в $$ в/TMP/сообщ

Мне нужно запустить скрипт perl с помощью stdin, который исходит из сценария bash.

это возможно и как?

я пытался, хотя я знаю, что это слишком глупо

cat in.$$> ./myscript.pl 
in.$$> ./myscript.pl 
in.$$> perl myscript.pl 
+1

Возможно, я неправильно понял это, но как насчет './myscript.pl in. $$'? – Birei

ответ

5

Чтобы указать содержимое файла в качестве стандартного ввода команды Баш, используйте <

./myscript.pl < in.$$ 

Чтобы использовать выход одной команды в качестве входа в другую команду, используйте '|' (Далее «труба» характер, как если бы вы посылали биты от одного процесса к другому через трубу)

cat in.$$ | ./myscript.pl 
echo foo | ./myscript.pl 
+0

Эта строка сработала: perl /home/merve/myscript.pl merveotesi

4

В вашем сценарии Perl, используйте оператор алмазную (так называемый нулевой файл обрабатывать):

нулевая указатель_на_файл <> является особенным: он может быть использован для имитации поведения sed и awk, и любой другой программы фильтра Unix, которая принимает список имен файлов, делать то же самое для каждой линии ввода от всех их. Вход от <> поступает либо из стандартного ввода, либо из каждого файла, указанного в командной строке. Вот как это работает: в первый раз оценивается <>, проверяется массив @ARGV, и если он пуст, $ARGV[0] установлен в «-», который при открытии дает вам стандартный ввод. Затем массив @ARGV обрабатывается как список имен файлов.

Вот пример:

#! /usr/bin/perl 
# cat command emulator 

while (my $line = <>) { 
    chomp $line; 
    say $line; 
} 

<> будет принимать каждый файл, указанный в командной строке, откройте их последовательно, а затем прочитать каждую строку, или тянуть линии в из STDIN.

Вы также можете сделать это:

while (my $line = <STDIN>) { 
    chomp $line; 
    say $line; 
} 

Что будет читать в строках из STDIN, но не будет читать файлы из командной строки.

Смежные вопросы