perl:sh:1:语法错误:错误的fd编号
我有一个非常简单的Perl脚本,失败时显示以下错误消息: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 &
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脚本中放入systemset
if (fork() == 0) {
open STDOUT, '>', '/dev/null';
open STDERR, '>&', *STDOUT;
exec "xterm";
POSIX::_exit();
}