perl:sh:1:语法错误:错误的fd编号

perl:sh:1:语法错误:错误的fd编号,perl,Perl,我有一个非常简单的Perl脚本,失败时显示以下错误消息: sh: 1: Syntax error: Bad fd number 这是两行的脚本 #!/usr/bin/perl system("xterm >& /dev/null &"); 如果我从命令行运行相同的xterm命令,它就会工作。从Perl脚本来看,它不是。怎么了 system(EXPR) 是[1]的缩写 换句话说,它需要一个bourneshell命令 xterm >& /dev/null &

我有一个非常简单的Perl脚本,失败时显示以下错误消息:

sh: 1: Syntax error: Bad fd number
这是两行的脚本

#!/usr/bin/perl
system("xterm >& /dev/null &");
如果我从命令行运行相同的xterm命令,它就会工作。从Perl脚本来看,它不是。怎么了

system(EXPR)
是[1]的缩写

换句话说,它需要一个bourneshell命令

xterm >& /dev/null &
不是有效的bourne shell命令。你想要

xterm >/dev/null 2>&1 &
也许在Perl之外测试时使用了不同的shell

从技术上讲,它更接近于

use Config qw( );
system($Config::Config{sh}, "-c", EXPR)
除了在窗户里


首先,在Bash中重定向stdout和stderr的首选语法是&>,而不是>&,因为后者可能与其他重定向形式混淆

其次,系统使用/bin/sh,其行为可能与默认shell不同

尝试显式地写出来,如中所示

system("xterm >/dev/null 2>&1 &");
或者干脆跳过外壳

if (fork() == 0) {
    open STDOUT, '>', '/dev/null';
    open STDERR, '>&', *STDOUT;
    exec "xterm";
    POSIX::_exit();
}

这对于Perl来说是相当新的吗?xterm>&/dev/null&适用于Perl 5.10。如果我在Perl脚本中放入systemsetif (fork() == 0) { open STDOUT, '>', '/dev/null'; open STDERR, '>&', *STDOUT; exec "xterm"; POSIX::_exit(); }