Почему исполняющая программа gtar вешает мою программу на Perl? - PullRequest
1 голос
/ 05 февраля 2009

При использовании gtar для добавления дополнительных файлов в существующий архив цикл завершается преждевременно или зависает. Он также завершается после создания исходного файла tar.gz.

Однако, если я удаляю вызовы gtar из цикла и вместо них помещаю операторы print, цикл выполняется должным образом. Кто-нибудь знает, почему это? Ниже приведен код, содержащийся внутри цикла.

if (-e "flex_$yearA"."_"."$monthA.tar.gz")
{ print"accessing Flex tar \n";
 exec "gtar --append --file=flex_$yearA"."_"."$monthA.tar.gz $FILE";
}
else
{ print "creating Flex Tar \n ";
 exec "gtar -cvsf flex_$yearA"."_"."$monthA.tar.gz $FILE"; 
}

Ответы [ 2 ]

5 голосов
/ 05 февраля 2009

Вы хотите "system", а не "exec". Вот более чистая версия:

my $tarball = "flex_${yearA}_${monthA}.tar.gz";

if ( -e $tarball ) { 
    print"accessing Flex tar \n";

    my $command = "gtar --append --file=$tarball $FILE";
    system($command) == 0
      or die "Could not ($command): $?";
}
else{ 
    print "creating Flex Tar \n ";
    my $command =  "gtar -cvsf $tarball $FILE";
    system($command) == 0
      or die "Could not ($command): $?";
}

Однако мне интересно, откуда взялись все эти переменные. Вы можете открыть здесь серьезную дыру в безопасности. Прочтите «perldoc -f system» для получения дополнительной информации о передаче списка системе (безопаснее).

2 голосов
/ 05 февраля 2009
* exec LIST

* exec PROGRAM LIST

Функция exec выполняет системную команду и никогда не возвращается - используйте system вместо exec, если хотите, чтобы она возвращалась. Он завершается неудачно и возвращает false только в том случае, если команда не существует и выполняется непосредственно, а не через командную оболочку вашей системы (см. Ниже).

Итак, в заключение, используйте системные или backticks`. Exec заменяет выполнение вашего скрипта другим.

Это должно работать как нужно.


if (-e "flex_$yearA"."_"."$monthA.tar.gz")
{ print"accessing Flex tar \n";
 system "gtar --append --file=flex_$yearA"."_"."$monthA.tar.gz $FILE";
}
else
{ print "creating Flex Tar \n ";
 system "gtar -cvsf flex_$yearA"."_"."$monthA.tar.gz $FILE"; 
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...