/ / perl: sh: 1: Chyba syntaxe: Zlé číslo fd - perl

perl: sh: 1: Chyba syntaxe: Zlé číslo fd - perl

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ď č. 1
system(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.


  1. 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();
}