Я полагаю, что цель состоит в том, чтобы изменить сценарий оболочки, который возвращает вызывающему объекту закодированный файл, чтобы он отправлял еще больше информации, в частности строку, которая будет использоваться в качестве флага в вызывающем устройстве.
Неясно, как скрипт оболочки запускается из скрипта Perl, но есть способы сделать это так, чтобы вызывающая сторона возвращала отдельные «строки», которые выводятся на печать, либо по мере того, как они испускаются, либо вообще после завершения запуска.
Затем вы можете просто добавить в сценарий оболочки необходимую дополнительную печать к STDOUT
и в вызывающей программе проверить каждую строку вывода оболочки, чтобы увидеть, соответствует ли она какому-либо «протоколу»;например, является ли она или начинается со строки special-file-found .Затем вы можете установить флаги для дальнейших вызовов или записать контрольный файл для последующих запусков и т. Д. В противном случае строка представляет собой закодированный файл.
Придуманный базовый пример с использованием pipe-open (см. в конце страницы)
use warnings;
use strict;
use feature 'say';
my @cmd = qw(ls -l ./);
my $file_found = quotemeta 'special-file-found';
my ($flag, $binfile);
my $pid = open my $out, '-|', @cmd or die "Can't open @cmd: $!";
while (<$out>) {
chomp;
if (/^$file_found/) {
$flag = 1;
}
else {
$binfile = $_;
# whatever else need be done, or perhaps last;
}
}
close $out;
В этом примере запускается команда ls -l ./
, но вместо нее вы можете запустить любой исполняемый файл, например @cmd = ('report.sh', 'arg1', 'arg2',...)
.
Другой способ заключается виспользуйте backticks ( qx * 1022 *) и присвойте его возврат массиву, и в этом случае каждый элемент получает строку вывода.
Еще один, лучший способ - использовать модуль, который управляет внешними командами.Например, от простого к более способному: IPC :: System :: Simple , Capture :: Tiny , IPC :: Run3 , IPC::. Run 1033 *