Как эта zip-команда используется в Perl?

Я нашел этот кусок кода в Perl

system("zip $ZIP_DEBUG -r -9 itvlib.zip $include $exclude");

Однако я не понимаю, как это работает. Я имею в виду, что system() используется для запуска «системных» команд, верно? Итак, эта команда «zip» используется здесь как «системная» команда? Но я попытался запустить только следующее в командной строке;

zip $ZIP_DEBUG -r -9 itvlib.zip arg1 arg2

Это не сработало! это дало следующую ошибку:

'zip' is not recognized as an internal or external command,
operable program or batch file.

Ну, этого не должно было случиться, поскольку команда, похоже, использует «zip» в качестве системной команды. Это делает команду 'zip' загадочной.

Не могли бы вы помочь мне понять эту команду со всеми ее параметрами?


person Chani    schedule 21.11.2011    source источник
comment
Что не работает из командной строки? Это поможет узнать. Кроме того, значения $include и $exclude интерполируются при выполнении этой строки; какие значения они имели в программе? (P.S. Я не против.)   -  person Ted Hopp    schedule 21.11.2011
comment
Извините, сэр, теперь я отредактировал вопрос соответствующим образом.   -  person Chani    schedule 21.11.2011
comment
@drunkMonk На будущее, это не сработало! не очень адекватное описание проблемы. Что не сработало? Команды не было? Какие сообщения об ошибках вы получили?   -  person TLP    schedule 21.11.2011
comment
@TLP Я отредактировал вопрос, как вы предложили ..   -  person Chani    schedule 21.11.2011
comment
@drunkMonk Похоже, вы используете систему Windows. zip (вероятно) относится к команде Linux. Это проблема с использованием системных вызовов.   -  person TLP    schedule 21.11.2011
comment
@TLP, но на самом деле он может архивировать файлы! это самая ироничная вещь.   -  person Chani    schedule 21.11.2011
comment
@drunkMonk Трудно сказать, не видя кода, но могут быть другие коды/модули, облегчающие архивирование в Windows.   -  person TLP    schedule 21.11.2011
comment
@TLP на самом деле просто использует zip exe в системе Windows :) (из ответа, который я принял)   -  person Chani    schedule 21.11.2011
comment
@drunkMonk Видите, как легко это стало, когда вы не использовали это, это не сработало !? знак равно   -  person TLP    schedule 21.11.2011
comment
да .. спасибо. Буду иметь в виду :)   -  person Chani    schedule 21.11.2011


Ответы (3)


system("zip $ZIP_DEBUG -r -9 itvlib.zip $include $exclude");

где-то на пути запущена программа с именем zip (вероятно, zip.exe). $ZIP_DEBUG, $include и $exclude — это переменные Perl, которые интерполируются в командную строку перед запуском команды.

Если вызов system работает в сценарии Perl, но zip -? выдает ошибку 'zip' is not recognized as an internal or external command, operable program or batch file, то PATH сценария Perl должен отличаться от PATH в вашей командной строке. Или в текущем каталоге может быть команда zip, когда Perl выполняет команду system. (В Windows текущий каталог является неявным членом вашего PATH.)

Чтобы увидеть, что такое PATH для скрипта Perl, вы можете добавить print "$ENV{PATH}\n"; перед системной командой. Чтобы узнать, что такое PATH в командной строке, введите PATH.

person cjm    schedule 21.11.2011

Вероятно, это не работает, поскольку вы не заменяете такие вещи, как $ZIP_DEBUG, их эквивалентными реальными значениями. В Perl они будут заменены значениями переменных перед передачей в вызов system.

Если вы распечатаете эти переменные Perl (или даже всю команду) до того, как выполните этот вызов system, вы обнаружите те реальные значения, которые вам нужно использовать. В качестве руководства вы можете использовать следующую расшифровку:

$ perl -e '
>     $ZIP_DEBUG = "xyzzy";
>     $include = "inc_files";
>     $exclude = "exc_files";
>     print "zip $ZIP_DEBUG -r -9 itvlib.zip $include $exclude";
> '
zip xyzzy -r -9 itvlib.zip inc_files exc_files

Подробнее о том, как работает system, см. здесь. Для получения подробной информации о том, что zip должно функционировать, вы должны просто запустить:

man zip

из оболочки командной строки (при условии, что вы работаете в Linux или его собратьях). Если вместо этого вы используете другую операционную систему (например, Windows), вам придется выяснить, как получить параметры zip. Это может быть таким же простым, как zip -? из zip -h, но нет гарантии, что это сработает.

Если это то же самое, что и Info-ZIP zip под Linux (и это может быть, если у вас есть опции -9 и -r и ваша переменная exclude начинается с -x), то zip -h даст вам базовую помощь, а zip -h2 даст вам гораздо больше.

person paxdiablo    schedule 21.11.2011
comment
точно сэр, зип-? или zip -h не работает. Я просто хочу увидеть кровавые подробности этой команды zip, которая использовалась здесь, я ищу, где я могу ее найти. - person Chani; 21.11.2011
comment
@drunkMonk, это полностью зависит от того, кто это сделал. Если zip -? (или другие варианты) не работают, попробуйте zip без аргументов. По умолчанию может быть предложено помочь или, по крайней мере, показать, как вы можете получить помощь. В противном случае найдите документацию для вашей конкретной zip программы. Я почти уверен, что он не входит в стандартную комплектацию Windows, поэтому вы, должно быть, получили его откуда-то еще. - person paxdiablo; 21.11.2011

Да, zip — это системная команда. Переменные $ZIP_DEBUG и тому подобное являются переменными Perl, которые интерполируются в команду перед запуском zip.

Чтобы отладить фактический вызов, попробуйте добавить:

print("zip $ZIP_DEBUG -r -9 itvlib.zip $include $exclude\n");

Подробнее о system см. perldoc.

person tuomassalo    schedule 21.11.2011