Понимание различий в различном использовании «системы» - PullRequest
2 голосов
/ 13 января 2012

В чем разница между этими двумя употреблениями system?

$cmd = "/my/code.pl";
$status = system("$cmd $var1");

против

$cmd = "/my/code.pl";
$status = system("$cmd", "$var1");

Ответы [ 3 ]

5 голосов
/ 13 января 2012

Первый (одна строка) вызов system запускает системную оболочку для запуска команды и (среди прочего) означает, что аргументы команды (из $var1) будут проходитьрасширение оболочки.

Вторая версия с множественными аргументами обходит системную оболочку, и аргументы не подвергаются дальнейшей обработке оболочки.Как правило, это рекомендуемый способ ведения дел.Однако обратите внимание, что это означает, что вам нужно беспокоиться о перенаправлении ввода / вывода.Если это проблема, то первая форма (используется осторожно) проще.В качестве альтернативы, изучите CPAN, чтобы найти модули для помощи - они обязательно будут.

4 голосов
/ 13 января 2012

Последний вариант лучше (в большинстве случаев), поскольку он явно передает каждый отдельный параметр в указанную команду в качестве одного аргумента командной строки.

В предыдущей версии любые пробелы, присутствующие в $cmd или $var1, приводили к отправке дополнительных (и, вероятно, нежелательных) аргументов командной строки.

Чтобы привести пример, с учетом $cmd = "cat" и $var1 = "/tmp/my test file" первая строка приведет к:

cat /tmp/my test file  # three parameters

и второй даст:

cat "/tmp/my test file"  # one parameter

Таким образом, первая версия будет разбивать имя файла на две части (и, вероятно, приведет к ошибкам «файл не найден»), но вторая версия сохранит $var1 без изменений в качестве одного параметра.

Однако, если вам нужно перенаправить вывод команды (например, 1> logfile 2>&1) или другие функции оболочки (глобализация, каналы и т. Д.), Вам необходимо использовать первую версию.

2 голосов
/ 13 января 2012

From: http://perldoc.perl.org/functions/system.html

Обратите внимание, что обработка аргументов варьируется в зависимости от количества аргументов.Если в LIST имеется более одного аргумента или если LIST является массивом с более чем одним значением, запускается программа, заданная первым элементом списка, с аргументами, заданными остальной частью списка.Если есть только один скалярный аргумент, этот аргумент проверяется на наличие метасимволов оболочки, и, если они есть, весь аргумент передается в системную командную оболочку для анализа (это / bin / sh -c на платформах Unix, но зависит отдругие платформы).Если в аргументе нет метасимволов оболочки, он разбивается на слова и передается непосредственно в execvp, что более эффективно.

Это означает, что если вам нужна оболочка (например, вы собираетесьчтобы использовать трубу |, например, ./someprog | wc), вам нужно использовать первый метод в вашем примере.

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