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