Mám veľmi jednoduchý skript v jazyku Perl, ktorý s touto chybovou správou zlyhá:
sh: 1: Syntax error: Bad fd number
Tu je skript (dva riadky)
#!/usr/bin/perl
system("xterm >& /dev/null &");
Ak spustím rovnaký príkaz xterm z príkazového riadka, bude to fungovať. Zo skriptu Perl to nie je. Čo sa deje?
odpovede:
4 pre odpoveď č. 1system(EXPR)
je skratka pre[1]
system("/bin/sh", "-c", EXPR)
Inými slovami, vyžaduje príkaz shellu.
xterm >& /dev/null &
nie je platný príkaz shellu burzy
xterm >/dev/null 2>&1 &
Možno ste použili iný shell, keď ste ho testovali mimo Perlu.
Technicky je to bližšie k
use Config qw( ); system($Config::Config{sh}, "-c", EXPR)
Okrem systému Windows.
2 pre odpoveď č. 2
Po prvé, preferovaná syntax pre presmerovanie stdout a stderr v Bash je &>
, nie >&
, pretože tieto sa môžu zamieňať s inými formami presmerovania.
Po druhé, system
použitie /bin/sh
ktoré sa môžu správať inak ako váš predvolený shell.
Skúste to napísať explicitne, ako v
system("xterm >/dev/null 2>&1 &");
alebo úplne preskočiť škrupinu.
if (fork() == 0) {
open STDOUT, ">", "/dev/null";
open STDERR, ">&", *STDOUT;
exec "xterm";
POSIX::_exit();
}