Страница 1 из 2

[PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 9:28:30
iye
Приветствую!
Написал скрипт:

Код: Выделить всё

#!/usr/bin/perl

$result=`fping -c4 -q xx.xx.xx.xx`;
print "\<$result\>\n";
И почему то результат выполнения fping -c4 -q xx.xx.xx.xx никак не загоняется в переменную... почитал доки, вроде все верно делаю. Подскажите плз, в чем я не прав ? Заранее благодарен за ответы.

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 9:47:06
Alex Keda

Код: Выделить всё

lissyara$ perl /tmp/a.pl
<PING 172.17.8.8 (172.17.8.8): 56 data bytes
64 bytes from 172.17.8.8: icmp_seq=0 ttl=127 time=0.346 ms
64 bytes from 172.17.8.8: icmp_seq=1 ttl=127 time=0.210 ms
64 bytes from 172.17.8.8: icmp_seq=2 ttl=127 time=0.191 ms
64 bytes from 172.17.8.8: icmp_seq=3 ttl=127 time=0.184 ms
64 bytes from 172.17.8.8: icmp_seq=4 ttl=127 time=0.161 ms

--- 172.17.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.161/0.218/0.346/0.066 ms
>
lissyara$ more /tmp/a.pl
#!/usr/bin/perl
#
$result=`/sbin/ping -c 5 172.17.8.8`;
print "\<$result\>\n";

lissyara$    
?

Код: Выделить всё

man hands.ko

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 9:52:05
iye
Если внимательно посмотреть мой код, то можно заметить, что я использую не стандартный пинг.

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 10:32:06
f_andrey
iye писал(а):Если внимательно посмотреть мой код, то можно заметить, что я использую не стандартный пинг.
А "Если внимательно посмотреть" код лисяры то можно понять, в чем ваша проблема :st:

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 10:40:37
iye
Если вы намекаете на то что там будет вывод больше чем одной строки -вы ошибаетесь.

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 10:54:20
ProFTP

Код: Выделить всё

/sbin/fping

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:01:34
thefree
стоит обратить внимание на
http://perl.about.com/od/programmingper ... system.htm

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:04:39
iye
Вот что я получаю на выполнение в консоли:

Код: Выделить всё

host# ./test.pl
xx.xx.xx.xx : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.15/0.21/0.27
<>
host#
Как мы видим проблема не в путях, не в многострочном выводе, а проблема в том что команда пишет вывод как то по хитрому.

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:07:15
iye
If your goal is to capture output, you should use the backtick operator:
$result = `PROGRAM`;
А у меня что ?

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:14:02
zg

Код: Выделить всё

zg# fping -c4 -q 127.0.0.1 > /dev/null
127.0.0.1 : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.03/0.04/0.06
zg#
намёк ясен?

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:15:33
ProFTP
iye писал(а):Вот что я получаю на выполнение в консоли:

Код: Выделить всё

host# ./test.pl
xx.xx.xx.xx : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.15/0.21/0.27
<>
host#
Как мы видим проблема не в путях, не в многострочном выводе, а проблема в том что команда пишет вывод как то по хитрому.
ты путь написал? какой путь?

/usr/local/bin/fping

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:18:48
iye
омг.. зачем путь то писать если команда выполняется ? Вот если бы оно писало что фалй не найден - там да в путях дело. Но команда то выполняется! Ладно .. прописал .. результат не изменился.

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:19:47
zg
iye писал(а):омг.. зачем путь то писать если команда выполняется ? Вот если бы оно писало что фалй не найден - там да в путях дело. Но команда то выполняется! Ладно .. прописал .. результат не изменился.
zg писал(а):намёк ясен?

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:20:31
iye
намёк ясен?
- я бы предпочел ключевое слово )

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:21:46
zg
zg писал(а):

Код: Выделить всё

zg# fping -c4 -q 127.0.0.1 > /dev/null
127.0.0.1 : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.03/0.04/0.06
zg#
намёк ясен?
вывод статистики идёт на STDERR, бэктик собирает данные из STDOUT

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:22:47
iye
Спасибо доктор )

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:28:08
hizel
Net::Ping чем не подходит?

и popen никто не отменял, правда в стандартной конструкции

Код: Выделить всё

open(PIPE,'prog |');
while(<PIPE>){
}
кушается только STDOUT
но есть кучка извратов шобэ хавать все, есть в факе
http://perldoc.perl.org/perlfaq8.html#H ... command%3f

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:42:40
zg
hizel писал(а):но есть кучка извратов шобэ хавать все
нафиг изварты, там стандратный sh

Код: Выделить всё

zg# cat 1.sh
#!/usr/local/bin/perl -w
open(PIPE,'fping -qc4 127.0.0.1 2>&1 |');
while(<PIPE>){print "--- Line\n";print; print "--- end line\n"}
zg# ./1.sh
--- Line
127.0.0.1 : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.03/0.04/0.06
--- end line
zg#

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:48:23
hizel
но забывать о
Note that you must use Bourne shell (sh(1)) redirection syntax in backticks, not csh(1)! Details on why Perl's system() and backtick and pipe opens all use the Bourne shell are in the versus/csh.whynot article in the "Far More Than You Ever Wanted To Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz . To capture a command's STDERR and STDOUT together:

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 11:58:31
zg
hizel писал(а):но забывать о
:smile:

Код: Выделить всё

zg# cat 1.sh
#!/usr/local/bin/perl -w

$result = `sh -c 'fping -qc4 127.0.0.1 2>&1'`;
print "Result: $result";

zg# ./1.sh
Result: 127.0.0.1 : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0.03/0.04/0.07
zg#

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 12:11:04
hizel
костыли в виде шелла :roll:

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 12:43:30
zg
hizel писал(а):костыли в виде шелла :roll:
так тоже костыль?

Код: Выделить всё

#!/usr/local/bin/perl -w

$ENV{SHELL} = '/bin/sh';

$result = `fping -qc4 127.0.0.1 2>\&1`;
print "Result: $result";
ЗЫ: с такими темпами скоро на перле буду писать :crazy:

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-03-19 13:03:45
hizel
некромант :roll:

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-12-10 8:14:19
ProFTP
не получается записать вывод в переменную или в массив (в скрипте)

вообщем есть код c ffmpeg, как но неопределеяется вывод прогарммы
как прочитать вывод команды?

Код: Выделить всё

   
 open( OUT2, "ffmpeg -i 1.flv |" );
# #$/ = '';
my @out = <OUT2>;
close OUT2;

print @out;

if  (@out) {
print '111';
}
обратные кавычки, тоже, не работают с ffmpeg

в других случаях у меня всегда работало

=====
=====

и что должно быть?

Код: Выделить всё

$out = system ("stty", '-icanon', 'eol', "\001");
print $out;
переменная всегда равняется 0


===

данный код, тоже что-то не работает

Код: Выделить всё

#!/usr/bin/perl

$ENV{SHELL} = '/bin/sh';

$result = `fping -qc4 127.0.0.1 2>\&1`;
print "Result: $result"
такой код работает

Код: Выделить всё

open(PIPE,'ping -c4 127.0.0.1 2>\&1 |');

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

такой код не работает, ничего не выводит вообще с переменной $_ $_...

Код: Выделить всё

open(PIPE,'ffmpeg -i  1.flv 2>\&1 |');

while(<PIPE>){
print $_;
print $_;
}
в чем дело? там вывод другой какой-то?

Re: [PERL]Чтение вывода системной команды

Добавлено: 2009-12-10 9:09:39
ProFTP
оно падло вывод толкало в STDERR

так и так работает

Код: Выделить всё

     use IPC::Open3;
    use Symbol qw(gensym);
    my $pid = open3(gensym, ">&STDERR", \*PH, "ffmpeg -i 1.flv");
    while( <PH> ) { print $_; print $_}
    waitpid($pid, 0);

Код: Выделить всё

    use IPC::Open3;
   use Symbol qw(gensym);
    use IO::File;
    local *CATCHOUT = IO::File->new_tmpfile;
    local *CATCHERR = IO::File->new_tmpfile;
    my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "ffmpeg -i 1.flv");
    waitpid($pid, 0);
    seek $_, 0, 0 for \*CATCHOUT, \*CATCHERR;
    while( <CATCHOUT> ) {
#print $_;
#print $_;
  }
   while( <CATCHERR> ) {
print $_;
print $_;

}

Код: Выделить всё

./perl2.pl
FFmpeg version SVN-r14424, Copyright (c) 2000-2008 Fabrice Bellard, et al.
FFmpeg version SVN-r14424, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --cc=cc --prefix=/usr/local --disable-debug --enable-memalign-hack --enable-shared --enable-postproc --extra-cflags=-I/usr/local/include/vorbis -I/usr/local/include --extra-ldflags=-L/usr/local/lib -la52 --extra-libs=-pthread --enable-gpl --enable-pthreads --enable-swscale --mandir=/usr/local/man --enable-liba52 --enable-liba52bin --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libamr-nb --enable-nonfree --enable-libamr-wb --enable-nonfree --disable-mmx --enable-libgsm --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid
  configuration: --cc=cc --prefix=/usr/local --disable-debug --enable-memalign-hack --enable-shared --enable-postproc --extra-cflags=-I/usr/local/include/vorbis -I/usr/local/include --extra-ldflags=-L/usr/local/lib -la52 --extra-libs=-pthread --enable-gpl --enable-pthreads --enable-swscale --mandir=/usr/local/man --enable-liba52 --enable-liba52bin --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libamr-nb --enable-nonfree --enable-libamr-wb --enable-nonfree --disable-mmx --enable-libgsm --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid
  libavutil version: 49.7.0
  libavutil version: 49.7.0
  libavcodec version: 51.61.0
  libavcodec version: 51.61.0
  libavformat version: 52.18.0
  libavformat version: 52.18.0
  libavdevice version: 52.0.0
  libavdevice version: 52.0.0
  built on Dec  5 2009 13:18:43, gcc: 4.2.1 20070719  [FreeBSD]
  built on Dec  5 2009 13:18:43, gcc: 4.2.1 20070719  [FreeBSD]


Seems stream 0 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 29.67 (89/3)
Seems stream 0 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 29.67 (89/3)
Input #0, flv, from '1.flv':
Input #0, flv, from '1.flv':
  Duration: 00:06:22.68, start: 0.000000, bitrate: 64 kb/s
  Duration: 00:06:22.68, start: 0.000000, bitrate: 64 kb/s
    Stream #0.0: Video: vp6f, yuv420p, 640x480, 29.67 tb(r)
    Stream #0.0: Video: vp6f, yuv420p, 640x480, 29.67 tb(r)
    Stream #0.1: Audio: mp3, 22050 Hz, mono, 64 kb/s
    Stream #0.1: Audio: mp3, 22050 Hz, mono, 64 kb/s
Must supply at least one output file
Must supply at least one output file