В Windows (с AcitveState perl 5.8 ...), когда я использую system
для вызова другой программы из моего сценария perl, например:
my $command="tool.exe"; # or 'C:\fullpath\tool.exe'
my $param = '...';
my $err = system($command, $param);
die("tool not found!") if $err == -1; # never used!
my $errno = $err>>8;
print "Command executed with error code: $errno\n";
Я никогда не смогуправильно определите, может ли tool.exe быть найден системой, потому что если он не найден (не находится по пути или не указан полный путь), system
, очевидно, автоматически передаст команду cmd.exe, который затем завершится ошибкой с либо path-not-found (код выхода 3) или с командой-not-found код выхода 1!
Как вы можете видеть, существует no метасимволы оболочки в указанной мной команде, поэтому я немного запутался, как туда входит оболочка.
Также обратите внимание, что я проверил (с помощью ProcessExplorer), что когда tool.exeв пути no cmd.exe будет задействован, то есть perl.exe будет прямым родительским процессом tool.exe.
Обходной путь: (??)
Следующее по крайней мере даст мне код выхода 255
, если команда не существует, хотя она появляетсябыть немного хакером, так как он напечатает Can't spawn "cmd.exe": No such file or directory at ...
в STDERR.
my $command="tool.exe"; # or 'C:\fullpath\tool.exe'
my @args = ($command, '...');
my $err = system {$command} @args;
# die("tool not found!") if $err == -1; # never used!
my $errno = $err>>8;
die("tool not found!") if $errno == 255;
print "Command executed with error code: $errno\n";