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