Выполнение команд в обход командного процессора

Оператор system также может вызываться с несколькими аргументами. В этом случае командный процессор не используется, какой бы сложной ни была команда:

my $tarfile = "something*wicked.tar";
my @dirs = qw(fred|flintstone betty );
system "tar", "cvf", $tarfile, @dirs;

Первый параметр ("tar" в приведенном примере) определяет имя команды, находимой стандартными средствами поиска в PATH, а остальные аргументы один за одним передаются команде. Даже если аргументы содержат символы, интерпретируемые командным процессором (например, имя файла в $tarfile или имена каталогов в @dirs), командный процессор не сможет обработать строку. Таким образом, команда tar получит ровно пять параметров. Сравните со следующим вызовом:

system "tar cvf $tarfile @dirs"; # Ошибка!

Обратите внимание: вызов system с одним аргументом практически эквивалентен следующему вызову с несколькими аргументами:

system $command_line;
system "/bin/sh", "-c", $command_line;

Но последний вариант записи почти не используется, если только вы не хотите, чтобы обработка выполнялась другим командным процессором, например C Shell:

system "/bin/csh", "-fc", $command_line;

Но и такая ситуация встречается редко, потому что Единственно Верный Командный Процессор обладает большей гибкостью.


Возвращаемое значение оператора system зависит от кода завершения дочерней команды. В UNIX код 0 означает, что все прошло нормально, а ненулевой код завершения обычно свидетельствует о возникших проблемах:

unless (system "date") {
# Возвращаемое значение равно нулю - признак успеха
print "We gave you a date, OK!\n";
}

В данном случае ситуация отличается от стандартной стратегии «true – хорошо, false – плохо», используемой большинством операторов, поэтому для применения типичной идиомы «сделай or die» придется поменять значения true и false. Проще всего снабдить оператор system префиксом ! (оператор логического отрицания):

!system "rm -rf files_to_delete" or die "something went wrong";

Здесь включать $! в сообщение об ошибке не следует. Любые возможные сбои почти наверняка произойдут из-за команды rm, а не из-за ошибки, связанной с вызовом system, о которой может сообщить переменная $!.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Ветвление
Обратные апострофы в списочном контексте
Обратные апострофы и сохранение вывода
Отправка и прием сигналов
Переменные среды

Вернуться в раздел: Perl / 15. Управление процессами