Perl:隐藏系统输出

Perl:隐藏系统输出

在 Linux 上使用 Perl 5.8.8,需要隐藏 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吗?

答案1

当您使用多个参数调用 system() 时,您是在告诉 perl 将其直接传递给 exec*() 调用之一,因此不会使用 shell 调用它。shell 是理解文件重定向的东西。试试这个:

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");

此外,为了使它更像系统管理员而不是程序员,您是否考虑过使用 wget 的 -q 选项,而不是跳过 shell/文件重定向环节?

相关内容