У мене дуже простий скрипт Perl, який не дає цього повідомлення про помилку:
sh: 1: Syntax error: Bad fd number
Ось сценарій (два рядки)
#!/usr/bin/perl
system("xterm >& /dev/null &");
Якщо я запускаю ту саму команду xterm з командного рядка, вона працює. Із сценарію Perl це не означає, що не так?
Відповіді:
4 для відповіді № 1system(EXPR)
короткий для[1]
system("/bin/sh", "-c", EXPR)
Іншими словами, потрібна команда Bourne shell.
xterm >& /dev/null &
не дійсна команда оболонки Bourne
xterm >/dev/null 2>&1 &
Можливо, ви використовували іншу оболонку, коли ви тестували її поза Perl.
Технічно це ближче до
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();
}