Назад | Перейти на главную страницу

Perl: скрыть вывод системы

При использовании Perl 5.8.8 в Linux необходимо, чтобы вывод команды perl 'system' был скрыт. Команда в моем коде:

system("wget", "$url", "-Omy_folder/$date-$target.html", "--user-agent=$useragent");

Я пробовал использовать > /dev/null 2>&1 в разных местах системной команды, например:

system("wget", "$url", "-Omy_folder/$date-$target.html", "--user-agent=$useragent","> /dev/null 2>&1");

Может ли кто-нибудь помочь мне с перенаправлением на /dev/null должно быть?

Когда вы вызываете system () с более чем одним аргументом, вы говорите Perl передать его напрямую одному из вызовов exec * (), поэтому он не будет вызываться оболочкой. Оболочка - это то, что понимает перенаправление файлов. Попробуй это:

system("wget $url -Omy_folder/$date-$target.html --user-agent=$useragent >/dev/null 2>&1");

Обратите внимание, что это технически менее безопасно, чем передача напрямую в exec.

Для цитирования используйте String :: ShellQuote или просто реализуйте логику самостоятельно:

sub sq {
  my $str = shift;

  if (!$str) {
    $str = "''";
  } else {
    $str =~ s|'|'\\''|g;
    $str = "'$str'";
    $str =~ s|^''||;
    $str =~ s|''$||;
  }

  return($str);
}

$useragent = sq($useragent);
system("wget $url -Omy_folder/$date-$target.html --user-agent=$useragent >/dev/null 2>&1");

Кроме того, чтобы сделать это немного больше sys-admin-y и немного меньше программиста, рассматривали ли вы возможность использования опции -q для wget вместо того, чтобы прыгать через обручи перенаправления оболочки / файла?