/ / perl: sh: 1: Errore di sintassi: numero di fd errato - perl

perl: sh: 1: Errore di sintassi: Bad numero fd - perl

Ho uno script Perl molto semplice che fallisce con questo messaggio di errore:

sh: 1: Syntax error: Bad fd number

Ecco lo script (due righe)

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

Se eseguo lo stesso comando xterm dalla riga di comando, funziona. Dallo script Perl, non è così. Cosa c'è che non va?

risposte:

4 per risposta № 1
system(EXPR)

è l'abbreviazione di[1]

system("/bin/sh", "-c", EXPR)

In altre parole, richiede un comando di shell di Bourne.

xterm >& /dev/null &

non è un comando valido per la shell di Bourne

xterm >/dev/null 2>&1 &

Forse hai usato una shell diversa quando l'hai provata al di fuori di Perl.


  1. Tecnicamente, è più vicino a

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

    Tranne che in Windows.


2 per risposta № 2

Innanzitutto, la sintassi preferita per reindirizzare sia stdout che stderr in Bash è &>no >&, perché quest'ultimo può essere confuso con altre forme di reindirizzamento.

In secondo luogo, system usi /bin/sh che può comportarsi in modo diverso rispetto alla shell predefinita.

Prova a scrivere esplicitamente, come in

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

o saltando del tutto il guscio.

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