我有一个非常简单的Perl脚本,但是出现此错误信息失败了:
sh: 1: Syntax error: Bad fd number
这是脚本(两行)
#!/usr/bin/perl
system("xterm >& /dev/null &");
如果我从命令行运行相同的xterm命令,它可以工作。从Perl脚本,它没有。怎么了?
答案 0 :(得分:4)
system(EXPR)
是 [1]
的缩写system("/bin/sh", "-c", EXPR)
换句话说,它需要一个bourne shell命令。
xterm >& /dev/null &
不是有效的bourne shell命令。你想要
xterm >/dev/null 2>&1 &
在Perl之外测试时,可能使用了不同的shell。
从技术上讲,它更接近
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();
}