/ / perl: sh: 1: Помилка синтаксису: Bad fd number - perl

perl: sh: 1: Синтаксична помилка: Поганий номер fd - perl

У мене дуже простий скрипт Perl, який не дає цього повідомлення про помилку:

sh: 1: Syntax error: Bad fd number

Ось сценарій (два рядки)

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

Якщо я запускаю ту саму команду xterm з командного рядка, вона працює. Із сценарію Perl це не означає, що не так?

Відповіді:

4 для відповіді № 1
system(EXPR)

короткий для[1]

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

Іншими словами, потрібна команда Bourne shell.

xterm >& /dev/null &

не дійсна команда оболонки Bourne

xterm >/dev/null 2>&1 &

Можливо, ви використовували іншу оболонку, коли ви тестували її поза Perl.


  1. Технічно це ближче до

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

    За винятком Windows.


2 для відповіді № 2

По-перше, кращим синтаксисом для перенаправлення як stdout, так і stderr в Bash є &>, ні >&, оскільки останню можна сплутати з іншими формами перенаправлення.

По-друге, system використовує /bin/sh яка може поводитися інакше, ніж ваша оболонка за замовчуванням.

Спробуйте записати це явно, як у

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

або зовсім пропустити оболонку.

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