2016-10-21 56 views
0

我希望得到一些有助於解決這個特定編碼問題的幫助。Perl將'<'視爲普通字符而不是輸出重定向

我有一個Perl腳本(#1)調用另一個Perl腳本(#2)。在#1中,我打電話#2也將其輸出重定向到日誌文件。像這樣

my @command = ('downloadImage', '-url', $url, '>', $log); 

該命令在終端上運行時運行良好。 我是否必須使用其他類型的特殊字符來告訴perl>輸出重定向不只是一些常規字符?

我運行它:

system(@command); 
+0

你是如何執行'@ command'? – Schwern

回答

4

我承擔全部代碼:

my @command = ('downloadImage', '-url', $url, '>', $log); 
system @command; 

system有兩種模式。 system $command將在shell中運行$command

# This will write 'foo' to the file 'bar' 
system "echo foo > bar"; 

system @command是真的system $program, @args。它將繞過外殼並使用@args運行$program

# This will print 'foo > bar' 
system "echo", "foo", ">", "bar" 

所以,如果你想做輸出重定向那樣你可以加入@command在一起。

system join " ", @command; 

但是,這可能會遇到shell引用問題。使用piped open自己在Perl中進行重定向更安全,更快速,更便於使用。

use strict; 
use warnings; 
use autodie; 

open my $echo, "-|", "echo", "foo"; 
open my $log, ">", "some.log"; 

print {$log} <$echo>; 
+2

提示:'print {$ log} $ _ while <$echo>;'減少內存開銷。 – ikegami

3

system('downloadImage', '-url', $url, '>', $log) 
在Perl

是一樣的,在外殼做

'downloadImage' '-url' "$url" '>' "$log" 

。這執行downloadImage與四個參數,其中之一是>。您嘗試執行的shell命令如下:

'downloadImage' '-url' "$url" > "$log" 

如果要執行該shell命令,首先需要一個shell。以下是你應該如何實現這一點:

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); 

不過,也有很多缺點,以使用shell。以下是一些備選:

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); 
} 

use IPC::Run3 qw(run3); 

my @cmd = ('downloadImage', '-url', $url); 

run3(\@cmd, \undef, $log); 

use IPC::Run qw(run); 

my @cmd = ('downloadImage', '-url', $url); 

run(\@cmd, '<', '/dev/null', '>', $log); 
+1

(我只包含IPC :: Open3,因爲它與Perl捆綁在一起,對大多數用戶來說,它實在太低級了。) – ikegami

相關問題