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