Perl 打开:重定向不';使用数组作为参数时不起作用? my$cmd=“$exe build 2>&1
您尝试使用的模式,Perl 打开:重定向不';使用数组作为参数时不起作用? my$cmd=“$exe build 2>&1,perl,Perl,您尝试使用的模式,open FILEHANDLE,mode,EXPR,LIST具有以下注释: 以管道打开的形式使用三个或更多参数,如果指定了LIST(命令名后的额外参数),则LIST将成为所调用命令的参数(如果平台支持它) 但是,使用2>&1和您尝试使用的模式,openfilehandle,mode,EXPR,LIST重定向时有以下注意事项: 以管道打开的形式使用三个或更多参数,如果指定了LIST(命令名后的额外参数),则LIST将成为所调用命令的参数(如果平台支持它) 但是,使用另一个答案中已
open FILEHANDLE,mode,EXPR,LIST
具有以下注释:
以管道打开的形式使用三个或更多参数,如果指定了LIST(命令名后的额外参数),则LIST将成为所调用命令的参数(如果平台支持它)
但是,使用
2>&1
和您尝试使用的模式,openfilehandle,mode,EXPR,LIST
重定向时有以下注意事项:
以管道打开的形式使用三个或更多参数,如果指定了LIST(命令名后的额外参数),则LIST将成为所调用命令的参数(如果平台支持它)
但是,使用另一个答案中已经指出的2>&1
和重定向-2>&1
和重定向-2>&1
和当只有一个参数时,它被视为shell命令
当有多个时,它被视为一个要执行的程序和该程序的参数
这意味着过去传递给shell的2>&1
现在作为参数传递给程序
使用使用相同约定的系统
很容易演示这一点
use IPC::Open3;
$pid = open3(my $exe_stdin, my $exe_stdout, my $exec_stderr,
'some cmd and args', 'optarg', ...);
自
my$full_cmd=“$exe build 2>&1&1&1当只有一个参数时,它被视为shell命令
当有多个时,它被视为一个要执行的程序和该程序的参数
这意味着过去传递给shell的2>&1
现在作为参数传递给程序
使用使用相同约定的系统
很容易演示这一点
use IPC::Open3;
$pid = open3(my $exe_stdin, my $exe_stdout, my $exec_stderr,
'some cmd and args', 'optarg', ...);
自
my$full\u cmd=“$exe build 2>&1&1&1&1必须正确地反斜杠/引用参数。使用open的列表形式的主要原因之一是避免涉及外壳程序的安全后果/复杂性。open3
解决方案可能更负责任。这是非常糟糕的建议。如果您想构建一个shell命令,它看起来像是use String::ShellQuote qw(shell_quote);shell_quote($exe,'fly')。'&1'
。不过,您必须正确地反斜杠/引用参数。使用open的列表形式的主要原因之一是避免涉及shell的安全后果/复杂性。open3
解决方案可能更负责任。这是非常糟糕的建议。如果您想构建一个shell命令,它看起来像是use String::ShellQuote qw(shell_quote);shell_quote($exe,'fly')。'&1'
.Re“您可以独立读取其他流”,而不是使用您使用的语法。你实际上做了相当于2>&1
。这真的很难做到。如果需要独立读取STDOUT和STDERR,请使用IPC::Run3或IPC::Run.Re“您可以独立读取其他流”,而不是使用您使用的语法。你实际上做了相当于2>&1
。这真的很难做到。如果需要独立地读取STDOUT和STDERR,请使用IPC::Run3或IPC::Run。
open $FH, q{-|}, join(' ', @cmd)
use IPC::Open3;
$pid = open3(my $exe_stdin, my $exe_stdout, my $exec_stderr,
'some cmd and args', 'optarg', ...);
$ perl -e'system(q{perl -E'\''say for @ARGV'\'' abc 2>&1})'
abc
$ perl -e'system(q{perl}, q{-E}, q{say for @ARGV}, q{abc}, q{2>&1})'
abc
2>&1
my $full_cmd = "$exe build 2>&1 </dev/null";
my @full_cmd = ('sh', '-c', "$exe build 2>&1 </dev/null");
my @cmd = ($exe, 'build');
my @full_cmd = ('sh', '-c', '"$@" </dev/null', '-', @cmd);
my $cmd = "$exe build 2>&1 </dev/null";
open(my $FH, '-|', $cmd)
or die("Can't launch $exe: $!\n");
my @cmd = ($exe, 'build');
open(my $FH, '-|', 'sh', '-c', '"$@" 2>&1 </dev/null', '-', @cmd)
or die("Can't launch $cmd[0]: $!\n");
use String::ShellQuote qw( shell_quote );
my @cmd = ($exe, 'build');
open(my $FH, '-|', shell_quote(@cmd).' 2>&1 </dev/null')
or die("Can't launch $cmd[0]: $!\n");