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

时间:2017-04-10 17:17:50

标签: perl

我有一个非常简单的Perl脚本,但是出现此错误信息失败了:

sh: 1: Syntax error: Bad fd number

这是脚本(两行)

#!/usr/bin/perl
system("xterm >& /dev/null &");

如果我从命令行运行相同的xterm命令,它可以工作。从Perl脚本,它没有。怎么了?

2 个答案:

答案 0 :(得分:4)

system(EXPR)

[1]

的缩写
system("/bin/sh", "-c", EXPR)

换句话说,它需要一个bourne shell命令。

xterm >& /dev/null &

不是有效的bourne shell命令。你想要

xterm >/dev/null 2>&1 &

在Perl之外测试时,可能使用了不同的shell。

  1. 从技术上讲,它更接近

    use Config qw( );
    system($Config::Config{sh}, "-c", EXPR)
    

    Windows除外。

答案 1 :(得分:2)

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

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

尝试明确写出来,如

system("xterm >/dev/null 2>&1 &");

或完全跳过shell。

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