/ / perl: sh: 1: Error de sintaxis: Número de fd incorrecto - perl

perl: sh: 1: error de sintaxis: número fd malo - perl

Tengo un script de Perl muy simple que falla con este mensaje de error:

sh: 1: Syntax error: Bad fd number

Aquí está el guión (dos líneas)

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

Si ejecuto el mismo comando xterm desde la línea de comandos, funciona. Desde el script de Perl, no lo hace. ¿Qué está mal?

Respuestas

4 para la respuesta № 1
system(EXPR)

es la abreviatura de[1]

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

En otras palabras, toma un comando de shell bourne.

xterm >& /dev/null &

no es un comando de shell válido de bourne. Desea

xterm >/dev/null 2>&1 &

Tal vez usaste un shell diferente cuando lo probaste fuera de Perl.


  1. Técnicamente, está más cerca de

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

    Excepto en Windows.


2 para la respuesta № 2

En primer lugar, la sintaxis preferida para redireccionar stdout y stderr en Bash es &>no >&, porque este último se puede confundir con otras formas de redireccionamiento.

En segundo lugar, system usos /bin/sh que puede comportarse de manera diferente a su shell por defecto.

Intenta escribirlo explícitamente, como en

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

o saltando la cáscara por completo.

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