system('downloadImage', '-url', $url, '>', $log)
in Perl zu tun, ist die gleiche wie
'downloadImage' '-url' "$url" '>' "$log"
in der Shell zu tun. Dieser führt downloadImage
mit vier Argumenten aus, von denen eines >
ist. Der Shell-Befehl Sie versuchen, ist die folgende auszuführen:
'downloadImage' '-url' "$url" > "$log"
Wenn Sie diese Shell-Befehl ausführen möchten, müssen Sie zunächst eine Shell benötigen. Hier finden Sie, wie Sie dies erreichen sollte:
jedoch
use String::ShellQuote qw(shell_quote);
my @cmd = ('downloadImage', '-url', $url);
my $shell_cmd = shell_quote(@cmd) . ' >' . shell_quote($log);
system($shell_cmd); # Short for system('/bin/sh', '-c', $shell_cmd);
, es gibt viele Nachteile, um eine Schale mit. Hier sind einige Alternativen:
use IPC::Open3 qw(open3);
my @cmd = ('downloadImage', '-url', $url);
{
open(local *CHILD_STDIN, '<', '/dev/null')
or die("Can't open \"/dev/null\": $!\n");
open(local *CHILD_STDOUT, '>', $log)
or die("Can't create \"$log\": $!\n");
my $pid = open3('<&CHILD_STDIN', '>&CHILD_STDOUT', '>&STDERR', @cmd);
waitpid($pid, 0);
}
oder
use IPC::Run3 qw(run3);
my @cmd = ('downloadImage', '-url', $url);
run3(\@cmd, \undef, $log);
oder
use IPC::Run qw(run);
my @cmd = ('downloadImage', '-url', $url);
run(\@cmd, '<', '/dev/null', '>', $log);
Wie ausführen Sie '@ command'? – Schwern