Perl - 如何抑制分叉子进程的输出

时间:2013-01-26 16:11:13

标签: perl process fork stdout

我有一个perl脚本,必须在exec中调用tar。

exec("tar zcf /tmp/mytarball.gz directoryToTarBall > /dev/null 2>&1" or die ("$!")

这是一个我分叉的子进程,与此同时,我通过写STDOUT的句号来监视tar的进度。我遇到的问题是我不希望tar在创建tarball时变得冗长 - 我不希望输出回显到stdout ....我只是想让进度计数器(完全停止)回显到屏幕。我以为我可以在exec命令中传递>/dev/null 2>&1,但这不起作用。

任何想法都很受欢迎。谢谢和问候

2 个答案:

答案 0 :(得分:3)

使用exec LIST表单可避免因shell引用而出现意外情况。这还需要执行shell为您执行的重定向。

use 5.10.0;  # //

my $pid = fork // die "$0: fork: $!";   # / fix Stack Overflow highlighting
if ($pid) {
  waitpid $pid, 0 or die "$0: waitpid: $!";
  warn "$0: child exited abnormally" if $?;
  print ".\n";  # done!
}
else {
  open STDOUT, ">",  "/dev/null" or die "$0: open: $!";
  open STDERR, ">&", \*STDOUT    or exit 1;
  exec "tar", "zcf", "/tmp/mytarball.gz", "directoryToTarBall";
  exit 1;
}

答案 1 :(得分:0)

perl -e "exec(\"ls >/dev/null\")"

至少为我工作。试试2>&1

这个令人费解的混乱也是如此

perl -e "exec(\"ls >&2 2>&1 1>/dev/null\")"

即使这样也行,但认为它可能不应该

perl -e "exec(\"ls 1>&2 >/dev/null\")"

你到底在哪里?